|
发表于 2020-7-23 10:03:21
|
显示全部楼层
self代表类的实例,而非类。
- class Test:
- def prt(self):
- print(self)
- print(self.__class__)
- t = Test()
- t.prt()
复制代码
执行结果如下
- <__main__.Test object at 0x000000000284E080>
- <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指的是描述符类的实例
不太容易理解,先看实例:
- class Desc:
- def __get__(self, ins, cls):
- print('self in Desc: %s ' % self )
- print(self, ins, cls)
- class Test:
- x = Desc()
- def prt(self):
- print('self in Test: %s' % self)
- t = Test()
- t.prt()
- t.x
复制代码
运行结果如下:
- self in Test: <__main__.Test object at 0x0000000002A570B8>
- self in Desc: <__main__.Desc object at 0x000000000283E208>
- <__main__.Desc object at 0x000000000283E208> <__main__.Test object at 0x0000000002A570B8> <class '__main__.Test'>
复制代码
self在定义时需要定义,但是在调用时会自动传入。
self的名字并不是规定死的,但是最好还是按照约定俗称用self
self指调用时的类的实例。 |
|