Python3里的super()和__class__使用介绍


Posted in Python onApril 23, 2015

子类里访问父类的同名属性,而又不想直接引用父类的名字,因为说不定什么时候会去修改它,所以数据还是只保留一份的好。其实呢,还有更好的理由不去直接引用父类的名字,参见 Python's super() considered super! | Deep Thoughts by Raymond Hettinger。

这时候就该 super() 登场啦——

class A:

  def m(self):

    print('A')
class B(A):

  def m(self):

    print('B')

    super().m()
B().m()

当然 Python 2 里 super() 是一定要参数的,所以得这么写:
class B(A):

  def m(self):

    print('B')

    super(B, self).m()

需要提到自己的名字。这个名字也是动态查找的,在这种情况下替换第三方库中的类会出问题。

super() 很好地解决了访问父类中的方法的问题。那么,如果要访问父类的父类(准确地说,是方法解析顺序(MRO)中位于第三的类)的属性呢?

比如,B 类是继承 A 的,它重写了 A 的 m 方法。现在我们需要一个 C 类,它需要 B 类的一些方法,但是不要 B 的 m 方法,而改用 A 的。怎么间接地引用到 A 的 m 方法呢?使用self.__class__肯定是不行的,因为 C 还可能被进一步继承。

从文档中我注意到,super 的实现是通过插入一个名为 __class__ 的名字来实现的(super 会从调用栈里去查找这个 __class__ 名字)。所以,就像文档里暗示的,其实可以直接在定义方法时访问 __class__ 名字,它总是该方法被定义的类。继续我们的单字母类:

class C(B):

  def m(self):

    print('C')

    # see the difference!

    print(__class__.__mro__)

    print(self.__class__.__mro__)

    __class__.__mro__[2].m(self)
class D(C):

  def m(self):

    print('D')

    super().m()
o = D()

o.m()

会得到:
D

C

(<class 't.C'>, <class 't.B'>, <class 't.A'>, <class 'object'>)

(<class 't.D'>, <class 't.C'>, <class 't.B'>, <class 't.A'>, <class 'object'>)

A

不过,PyPy 并不支持这个 __class__ 名字。
Python 相关文章推荐
Python中防止sql注入的方法详解
Feb 25 Python
利用Python实现网络测试的脚本分享
May 26 Python
50行Python代码实现人脸检测功能
Jan 23 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
Apr 23 Python
Python使用pickle模块储存对象操作示例
Aug 15 Python
浅谈解除装饰器作用(python3新增)
Oct 15 Python
PyQt5实现QLineEdit添加clicked信号的方法
Jun 25 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
Oct 04 Python
Python while true实现爬虫定时任务
Jun 08 Python
深入理解Python变量的数据类型和存储
Feb 01 Python
python利用xpath爬取网上数据并存储到django模型中
Feb 26 Python
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
Apr 14 Python
Python实现的飞速中文网小说下载脚本
Apr 23 #Python
Python中使用PyQt把网页转换成PDF操作代码实例
Apr 23 #Python
Python里disconnect UDP套接字的方法
Apr 23 #Python
Python实现的Google IP 可用性检测脚本
Apr 23 #Python
Python3.2中的字符串函数学习总结
Apr 23 #Python
Python与Redis的连接教程
Apr 22 #Python
Python实现的数据结构与算法之快速排序详解
Apr 22 #Python
You might like
让Json更懂中文(JSON_UNESCAPED_UNICODE)
2011/10/27 PHP
自己写了一个php检测文件编码的函数
2014/04/21 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
2018/07/21 PHP
如何在PHP中生成随机数
2020/06/04 PHP
Gambit vs CL BO3 第一场 2.13
2021/03/10 DOTA
prototype 的说明 js类
2006/09/07 Javascript
Add Formatted Data to a Spreadsheet
2007/06/12 Javascript
javascript支持firefox,ie7页面布局拖拽效果代码
2007/12/20 Javascript
JQuery中操作Css样式的方法
2014/02/12 Javascript
JavaScript常用脚本汇总(一)
2015/03/04 Javascript
js中日期的加减法
2015/05/06 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
2016/02/20 Javascript
JS中跳出循环的示例代码
2017/09/14 Javascript
vue-cli整合vuex的时候,修改actions和mutations,实现热部署的方法
2018/09/19 Javascript
微信小程序实现左滑修改、删除功能
2020/10/19 Javascript
详解小程序如何避免多次点击,重复触发事件
2019/04/08 Javascript
关于JS模块化的知识点分享
2019/10/16 Javascript
nuxt 服务器渲染动态设置 title和seo关键字的操作
2020/11/05 Javascript
[01:07]DOTA2次级职业联赛 - Fpb战队宣传片
2014/12/01 DOTA
python操作xml文件示例
2014/04/07 Python
Python实现基于HTTP文件传输实例
2014/11/08 Python
在Python中处理XML的教程
2015/04/29 Python
python运行其他程序的实现方法
2017/07/14 Python
Python爬取个人微信朋友信息操作示例
2018/08/03 Python
pyqt 实现在Widgets中显示图片和文字的方法
2019/06/13 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
python调用支付宝支付接口流程
2019/08/15 Python
Python time库基本使用方法分析
2019/12/13 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
中国汽车租赁行业头部企业:一嗨租车
2019/05/16 全球购物
你所知道的集合类都有哪些?主要方法?
2012/12/31 面试题
品质主管的岗位职责
2013/12/04 职场文书
团日活动总结报告
2014/06/25 职场文书
2014国庆节演讲稿:祖国在我心中(400字)
2014/09/25 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
JavaScript如何优化逻辑判断代码详解
2021/06/08 Javascript