Python教程:self用法
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用法相关推荐
- 【基础教程】Python转义字符及用法
ASCII 编码为每个字符都分配了唯一的编号,称为编码值.在 Python 中,一个 ASCII 字符除了可以用它的实体(也就是真正的字符)表示,还可以用它的编码值表示.这种使用编码值来间接地表示字符 ...
- 信息学奥赛 python 教程_Python在信息学竞赛中的运用及Python的基本用法(详解)
前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在<算法竞赛入门经典-训练指南>中所说的一样,如果会用 ...
- 简明python教程在线-简明python教程
广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. usrbinpython#hello_world.pyprinthell ...
- 零基础自学python教程-零基础5个月快速学会Python的秘诀
点击蓝字"python教程"关注我们哟! 零基础该怎么快速学习Python呢?如何用5个月快速学会Python? 1 这里主要讲一下python基础与爬虫 个人认为可以分为两步走: ...
- vue函数如何调用其他函数?_好程序员Python教程系列之递归函数与匿名函数调用...
好程序员Python教程系列递归函数与匿名函数调用,函数是Python技术学习中重要的一个环节,深入掌握该阶段的知识内容,对于Python技术能力的提升非常有帮助,这里就针对递归函数与匿名函数两种函数 ...
- 在Windows平台下实现《简明 Python 教程》第十章案例(利用winrar实现压缩备份)...
在<简明Python教程>第十章,作者以一个小的脚本开发作为案例讲解Python(http://woodpecker.org.cn/abyteofpython_cn/chinese/ch1 ...
- 【转】简明 Python 教程
原文网址:http://woodpecker.org.cn/abyteofpython_cn/chinese/ 简明 Python 教程 Swaroop, C. H. 著 沈洁元 译 www.byt ...
- python全免费教程-python教程免费
广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 使用步骤在 cvm 上部署好 python 环境及 python-mem ...
- python廖老师课程资源,廖老师的python教程
python推荐夜曲还是廖雪峰 夜曲编程这是真正适合从零开始学习Python的编程小白,一个非常有趣的线上课程.廖雪峰官方网站是编程大佬. 很多Python入门推荐里都会提到的一个学习渠道我认为更适合 ...
- 《简明python教程》笔记一
读<简明Python教程>笔记: 本书的官方网站是www.byteofpython.info 安装就不说了,网上很多,这里就记录下我在安装时的问题,首先到python官网下载,选好安装路 ...
最新文章
- 纠结pytorch, tensorflow, keras 一个月之后,我自己创造了一个神经网络框架
- 湖北大学829数据库原理与c语言程序设计,2017年湖北大学教育学院829数据库原理与C语言程序设计考研强化模拟题...
- Scrapy框架--使用cookie
- SAP PP CS01使用ECR去创建BOM主数据,报错:System status: ECR is not yet approved.
- F#创建者Don Syme谈F#设计原则
- 在VIM里面设置自动补全功能
- javafx爬取网页并且初始化网页数据
- 基于JAVA+Servlet+JSP+MYSQL的停车管理系统
- 西门子for循环例子_理解JavaScript中的循环缺陷和迭代协议
- 德克萨斯州ADRN组织支持12种加密货币捐赠 现已收到700美元ETH捐款
- python 基础复习
- 【工程师学算法】工程常用算法(二)—— 卡尔曼滤波(Kalman Filter)
- GVS与唯康教育达成战略合作,共建智能家居人才培养高地
- WIN10使用VEH+硬件断点实现不修改代码完成破解
- COMSOL电化学专题培训通知
- Mac 清理垃圾工具 Clean My Mac破解版
- Android面试分析一:关于OKhttp详解(附带视频教程,flutter游戏全屏
- 计算机房需要排风吗,机房新风排风系统怎么样 机房新风排风系统原理介绍【详解】...
- html感叹号图形代码,canvas3:绘制感叹号
- PHP搭建织梦网站,织梦官方php服务器环境DedeAMPZ安装教程
热门文章
- 三五族化合物半导体的杂质能级
- excel smart流程图增加_Excel表格中怎么使用SmartArt绘制各种流程图
- [bzoj4998][LCT][并查集]星球联盟
- 贪心练习——肥鼠的交易
- 认识js函数对象(Function Object)
- 在java中append是什么_Java中的append方法是什么?
- onTouch事件中抬手时让View自动归位
- vb.net datetimepicker月到当日的天数_听丨6月30日,黄石人的公积金有大变化
- eclipse java启动参数_Eclipse启动参数设置
- 三星手机中的重要照片丢失能恢复吗