1. self代表类的实例,而非类

class Test:def prt(self):print(self)print(self.__class__)t = Test()
t.prt()
--------------------------------------------
<__main__.Test object at 0x000002345ED1DFC8>
<class '__main__.Test'>

上面的例子,self 代表的是类的实例。而 self.class 则指向类。

2. self不必写成self

学过其他语言的,觉得 self 怪怪的,想写成 this,也是可以的。

class Test:def prt(this):print(this)print(this.__class__)t = Test()
t.prt()

改成 this,运行结果一样。但最好还是尊重约定俗成的习惯。

3. self可以不写吗

在 python 中,当我们调用 t.prt() 时,实际上 python 解释成 Test.prt(t),也就是说把 self 替换成类的实例。

class Test:def prt():print(self)t = Test()
t.prt()

运行时出错,因为 prt 没有参数,我们强行传了一个参数,t.prt() 等同于Test.prt(t)。

TypeError                                 Traceback (most recent call last)
<ipython-input-2-282f362e7e8c> in <module>4 5 t = Test()
----> 6 t.prt()TypeError: prt() takes 0 positional arguments but 1 was given

当然,我们可以定义和调用时均不传类的实例,这就是类方法。

class Test:def prt():print(__class__)
Test.prt()
------------------------
<class '__main__.Test'>

4. 继承时,传入的是哪个实例,就是那个传入实例,而不是指定义了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 0x0000023460235C48>
<__main__.Child object at 0x0000023460235C48>
<__main__.Parent object at 0x0000023460235C88>

运行 c.cprt() 时,指的是 Child 类的实例。

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

5. 在描述符类中,self指的是描述符类的实例

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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 0x000002346022D308>
self in Desc: <__main__.Desc object at 0x000002346022D2C8>
<__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 运行的结果。

self in Test: <__main__.Test object at 0x00000234602280C8>
self in Desc: <__main__.Desc object at 0x0000023460228388>
<__main__.Desc object at 0x0000023460228388> None <class '__main__.Test'>

题外话:由于很多时候描述符类中仍然需要知道调用该描述符的实例是谁,所以在描述符类中存在第二个参数 ins,用来表示调用它的类实例,所以 t.x 可以看到第三行中的运行结果中第二项 <__main__.Test object at 0x000002346022D308>。而采用 Test.x进行调用时,没有实例,返回None。

总结

  • self 在定义时需要定义,但是在调用时会自动传入
  • self 的名字并不是规定死的,但最好还是按照约定使用 self
  • self 总是指调用时的类的实例。

Python教程:self用法相关推荐

  1. 【基础教程】Python转义字符及用法

    ASCII 编码为每个字符都分配了唯一的编号,称为编码值.在 Python 中,一个 ASCII 字符除了可以用它的实体(也就是真正的字符)表示,还可以用它的编码值表示.这种使用编码值来间接地表示字符 ...

  2. 信息学奥赛 python 教程_Python在信息学竞赛中的运用及Python的基本用法(详解)

    前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在<算法竞赛入门经典-训练指南>中所说的一样,如果会用 ...

  3. 简明python教程在线-简明python教程

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. usrbinpython#hello_world.pyprinthell ...

  4. 零基础自学python教程-零基础5个月快速学会Python的秘诀

    点击蓝字"python教程"关注我们哟! 零基础该怎么快速学习Python呢?如何用5个月快速学会Python? 1 这里主要讲一下python基础与爬虫 个人认为可以分为两步走: ...

  5. vue函数如何调用其他函数?_好程序员Python教程系列之递归函数与匿名函数调用...

    好程序员Python教程系列递归函数与匿名函数调用,函数是Python技术学习中重要的一个环节,深入掌握该阶段的知识内容,对于Python技术能力的提升非常有帮助,这里就针对递归函数与匿名函数两种函数 ...

  6. 在Windows平台下实现《简明 Python 教程》第十章案例(利用winrar实现压缩备份)...

    在<简明Python教程>第十章,作者以一个小的脚本开发作为案例讲解Python(http://woodpecker.org.cn/abyteofpython_cn/chinese/ch1 ...

  7. 【转】简明 Python 教程

    原文网址:http://woodpecker.org.cn/abyteofpython_cn/chinese/ 简明 Python 教程 Swaroop, C. H. 著 沈洁元  译 www.byt ...

  8. python全免费教程-python教程免费

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 使用步骤在 cvm 上部署好 python 环境及 python-mem ...

  9. python廖老师课程资源,廖老师的python教程

    python推荐夜曲还是廖雪峰 夜曲编程这是真正适合从零开始学习Python的编程小白,一个非常有趣的线上课程.廖雪峰官方网站是编程大佬. 很多Python入门推荐里都会提到的一个学习渠道我认为更适合 ...

  10. 《简明python教程》笔记一

    读<简明Python教程>笔记: 本书的官方网站是www.byteofpython.info  安装就不说了,网上很多,这里就记录下我在安装时的问题,首先到python官网下载,选好安装路 ...

最新文章

  1. 纠结pytorch, tensorflow, keras 一个月之后,我自己创造了一个神经网络框架
  2. 湖北大学829数据库原理与c语言程序设计,2017年湖北大学教育学院829数据库原理与C语言程序设计考研强化模拟题...
  3. Scrapy框架--使用cookie
  4. SAP PP CS01使用ECR去创建BOM主数据,报错:System status: ECR is not yet approved.
  5. F#创建者Don Syme谈F#设计原则
  6. 在VIM里面设置自动补全功能
  7. javafx爬取网页并且初始化网页数据
  8. 基于JAVA+Servlet+JSP+MYSQL的停车管理系统
  9. 西门子for循环例子_理解JavaScript中的循环缺陷和迭代协议
  10. 德克萨斯州ADRN组织支持12种加密货币捐赠 现已收到700美元ETH捐款
  11. python 基础复习
  12. 【工程师学算法】工程常用算法(二)—— 卡尔曼滤波(Kalman Filter)
  13. GVS与唯康教育达成战略合作,共建智能家居人才培养高地
  14. WIN10使用VEH+硬件断点实现不修改代码完成破解
  15. COMSOL电化学专题培训通知
  16. Mac 清理垃圾工具 Clean My Mac破解版
  17. Android面试分析一:关于OKhttp详解(附带视频教程,flutter游戏全屏
  18. 计算机房需要排风吗,机房新风排风系统怎么样 机房新风排风系统原理介绍【详解】...
  19. html感叹号图形代码,canvas3:绘制感叹号
  20. PHP搭建织梦网站,织梦官方php服务器环境DedeAMPZ安装教程

热门文章

  1. 三五族化合物半导体的杂质能级
  2. excel smart流程图增加_Excel表格中怎么使用SmartArt绘制各种流程图
  3. [bzoj4998][LCT][并查集]星球联盟
  4. 贪心练习——肥鼠的交易
  5. 认识js函数对象(Function Object)
  6. 在java中append是什么_Java中的append方法是什么?
  7. onTouch事件中抬手时让View自动归位
  8. vb.net datetimepicker月到当日的天数_听丨6月30日,黄石人的公积金有大变化
  9. eclipse java启动参数_Eclipse启动参数设置
  10. 三星手机中的重要照片丢失能恢复吗