先看一个例子:
class Test: def prt(self): print(self) print(self.__class__) t = Test() t.prt()
实行效果以下
<__main__.Test object at 0x000000000284E080> <class '__main__.Test'>
从上面的例子中能够很明显的看出,self代表的是类的实例。而self.class则指向类。
self能够不写吗
在Python的诠释器内部,当我们挪用t.prt()时,现实上Python诠释成Test.prt(t),也就是说把self替换成类的实例。
把上面的t.prt()一行改写一下,运转后的现实效果完全相同。
现实上已部份说清楚明了self在定义时不能够省略
class Test: def prt(): print(self) t = Test() t.prt()
运转时提示毛病以下:prt在定义时没有参数,然则运转时强行传了一个参数。
因为上面诠释过了t.prt()等同于Test.prt(t),所以顺序提示多传了一个参数t。
Traceback (most recent call last): File "h.py", line 6, in <module> t.prt() TypeError: prt() takes 0 positional arguments but 1 was given
假如定义和挪用时均不传类实例是能够的,就是类要领。
class Test: def prt(): print(__class__) Test.prt()
运转效果以下
<class '__main__.Test'>
在继续时,传入的是哪一个实例,就是谁人传入的实例,而不是指定义了self的类的实例。
先看代码
class Parent: def pprt(self): print(self) class Child(Parent): def cprt(self): print(self) c = Child() c.cprt() c.pprt() p = Parent() p.pprt()
运转效果以下
<__main__.Child object at 0x0000000002A47080> <__main__.Child object at 0x0000000002A47080> <__main__.Parent object at 0x0000000002A47240>
诠释:
运转c.cprt()时应当没有明白题目,指的是Child类的实例。
然则在运转c.pprt()时,等同于Child.pprt(c),所以self指的依然是Child类的实例,因为self中没有定义pprt()要领,
所以沿着继续树往上找,发如今父类Parent中定义了pprt()要领,所以就会胜利挪用。
总结
self在定义时须要定义,然则在挪用时会自动传入。
self的名字并非规定死的,然则最好照样根据约定是用self
self老是指挪用时的类的实例。
以上就是python中的self过剩吗的细致内容,更多请关注ki4网别的相干文章!