公爵黑卡 发表于 2020-7-23 09:56:46

我至今还是不明白,self是啥...(python)

哪个大神能通俗易懂的解释一下......

Twilight6 发表于 2020-7-23 09:57:55


self 就是实例对象本身

比如你定义了一个 A类,然后要将 A 类实例化, a = A()此时实例化对象就为 a ,而且这个实例对象的 self 参数就代表 a


公爵黑卡 发表于 2020-7-23 10:01:22

奥,懂了,谢谢!

Hello. 发表于 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指调用时的类的实例。

小甲鱼的铁粉 发表于 2020-7-23 10:18:21

类与对象还是比较难的{:10_266:}

Alex_Cai 发表于 2020-10-21 13:26:57

本帖最后由 Alex_Cai 于 2020-10-21 13:44 编辑

Hello. 发表于 2020-7-23 10:03
self代表类的实例,而非类。




请教一下t.prt()为什么self给了Desc,不理解

不好意思 搞错了明白了
页: [1]
查看完整版本: 我至今还是不明白,self是啥...(python)