• 售前

  • 售后

热门帖子
入门百科

Python教程:self用法

[复制链接]
刘久田 显示全部楼层 发表于 2022-8-9 19:47:06 |阅读模式 打印 上一主题 下一主题
1. self代表类的实例,而非类

  1. class Test:
  2.     def prt(self):
  3.         print(self)
  4.         print(self.__class__)
  5.         
  6. t = Test()
  7. t.prt()
  8. --------------------------------------------
  9. <__main__.Test object at 0x000002345ED1DFC8>
  10. <class '__main__.Test'>
复制代码
上面的例子,self 代表的是类的实例。而 self.class 则指向类。
2. self不必写成self

学过其他语言的,以为 self 怪怪的,想写成 this,也是可以的。
  1. class Test:
  2.     def prt(this):
  3.         print(this)
  4.         print(this.__class__)
  5.         
  6. t = Test()
  7. t.prt()
复制代码
改成 this,运行效果一样。但最好照旧恭敬约定俗成的风俗。
3. self可以不写吗

在 python 中,当我们调用 t.prt() 时,实际上 python 表明成 Test.prt(t),也就是说把 self 更换成类的实例。
  1. class Test:
  2.     def prt():
  3.         print(self)
  4.         
  5. t = Test()
  6. t.prt()
复制代码
运行时堕落,由于 prt 没有参数,我们强行传了一个参数,t.prt() 等同于Test.prt(t)。
  1. TypeError                                 Traceback (most recent call last)
  2. <ipython-input-2-282f362e7e8c> in <module>
  3.       4
  4.       5 t = Test()
  5. ----> 6 t.prt()
  6. TypeError: prt() takes 0 positional arguments but 1 was given
复制代码
固然,我们可以界说和调用时均不传类的实例,这就是类方法。
  1. class Test:
  2.     def prt():
  3.         print(__class__)
  4. Test.prt()
  5. ------------------------
  6. <class '__main__.Test'>
复制代码
4. 继续时,传入的是哪个实例,就是谁人传入实例,而不是指界说了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()
  12. -------------------------------------------------
  13. <__main__.Child object at 0x0000023460235C48>
  14. <__main__.Child object at 0x0000023460235C48>
  15. <__main__.Parent object at 0x0000023460235C88>
复制代码
运行 c.cprt() 时,指的是 Child 类的实例。
但是在运行 c.pprt()时,等同于 Child.pprt©,以是 self 指的依然是 Child 类的实例,由于 self 中没有界说 pprt() 方法,以是沿着继续树往上找,发现父类 Parent 中界说了 pprt() 方法,以是就会调用。
5. 在形貌符类中,self指的是形貌符类的实例

  1. '''
  2. 学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
  3. 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
  4. '''
  5. class Desc:
  6.     def __get__(self, ins, cls):
  7.         print('self in Desc: %s' % self)
  8.         print(self, ins, cls)
  9.         
  10. class Test:
  11.     x = Desc()
  12.     def prt(self):
  13.         print('self in Test: %s' % self)
  14. t = Test()
  15. t.prt()
  16. t.x
  17. -----------------------------------------------
  18. self in Test: <__main__.Test object at 0x000002346022D308>
  19. self in Desc: <__main__.Desc object at 0x000002346022D2C8>
  20. <__main__.Desc object at 0x000002346022D2C8> <__main__.Test object at 0x000002346022D308> <class '__main__.Test'>
复制代码
为什么在 Desc 类中界说的 self 不是应该调用它的实例 t 吗?怎么变成了 Desc 类的实例了?
留意:这里调用的是 t.x,也就是说 Test 类的实例 t 的属性 x,由于实例 t 中没有界说属性 x,以是找到类属性 x,而该属性是形貌符属性,为 Desc 类的实例而已,以是此处没有中用 Test 的任何方法。
假如直接通过类来调用属性 x 也可以得到雷同的效果。
下面是把 t.x 改为 Test.x 运行的效果。
  1. self in Test: <__main__.Test object at 0x00000234602280C8>
  2. self in Desc: <__main__.Desc object at 0x0000023460228388>
  3. <__main__.Desc object at 0x0000023460228388> None <class '__main__.Test'>
复制代码
题外话:由于许多时间形貌符类中仍然须要知道调用该形貌符的实例是谁,以是在形貌符类中存在第二个参数 ins,用来体现调用它的类实例,以是 t.x 可以看到第三行中的运行效果中第二项 。而接纳 Test.x举行调用时,没有实例,返回None。
总结



  • self 在界说时须要界说,但是在调用时会主动传入
  • self 的名字并不是规定死的,但最好照旧按照约定使用 self
  • self 总是指调用时的类的实例。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作