鱼C论坛

 找回密码
 立即注册
查看: 1806|回复: 5

[已解决]我至今还是不明白,self是啥...(python)

[复制链接]
发表于 2020-7-23 09:56:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
哪个大神能通俗易懂的解释一下......
最佳答案
2020-7-23 09:57:55

self 就是实例对象本身

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


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-23 09:57:55 | 显示全部楼层    本楼为最佳答案   

self 就是实例对象本身

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


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-7-23 10:01:22 | 显示全部楼层
奥,懂了,谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-23 10:03:21 | 显示全部楼层
self代表类的实例,而非类。

  1. class Test:
  2.     def prt(self):
  3.         print(self)
  4.         print(self.__class__)

  5. t = Test()
  6. t.prt()
复制代码


执行结果如下
  1. <__main__.Test object at 0x000000000284E080>
  2. <class '__main__.Test'>
复制代码


在继承时,不是指定义了 self 的类的实例

  1. class Parent:
  2.     def pprt(self):
  3.         print(self)

  4. class Child(Parent):
  5.     def cprt(self):
  6.         print(self)
  7. c = Child()
  8. c.cprt()
  9. c.pprt()
  10. p = Parent()
  11. p.pprt()
复制代码


运行结果如下

  1. <__main__.Child object at 0x0000000002A47080>
  2. <__main__.Child object at 0x0000000002A47080>
  3. <__main__.Parent object at 0x0000000002A47240>
复制代码


解释:
运行c.cprt()时应该没有理解问题,指的是Child类的实例。
但是在运行c.pprt()时,等同于Child.pprt(c),所以self指的依然是Child类的实例,由于self中没有定义pprt()方法,所以沿着继承树往上找,发现在父类Parent中定义了pprt()方法,所以就会成功调用。

在描述符类中,self指的是描述符类的实例
不太容易理解,先看实例:

  1. class Desc:
  2.     def __get__(self, ins, cls):
  3.         print('self in Desc: %s ' % self )
  4.         print(self, ins, cls)
  5. class Test:
  6.     x = Desc()
  7.     def prt(self):
  8.         print('self in Test: %s' % self)
  9. t = Test()
  10. t.prt()
  11. t.x
复制代码

运行结果如下:

  1. self in Test: <__main__.Test object at 0x0000000002A570B8>
  2. self in Desc: <__main__.Desc object at 0x000000000283E208>
  3. <__main__.Desc object at 0x000000000283E208> <__main__.Test object at 0x0000000002A570B8> <class '__main__.Test'>
复制代码


self在定义时需要定义,但是在调用时会自动传入。
self的名字并不是规定死的,但是最好还是按照约定俗称用self
self指调用时的类的实例。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2020-7-23 10:18:21 | 显示全部楼层
类与对象还是比较难的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-21 13:26:57 | 显示全部楼层
本帖最后由 Alex_Cai 于 2020-10-21 13:44 编辑
Hello. 发表于 2020-7-23 10:03
self代表类的实例,而非类。


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

不好意思 搞错了  明白了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-27 10:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表