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 server乱码的解决方法
Jan 28 Python
简单介绍Python下自己编写web框架的一些要点
Apr 29 Python
Python和C/C++交互的几种方法总结
May 11 Python
基于Python列表解析(列表推导式)
Jun 23 Python
对python3 一组数值的归一化处理方法详解
Jul 11 Python
python实现在图片上画特定大小角度矩形框
Oct 24 Python
Python文件读写常见用法总结
Feb 22 Python
Dlib+OpenCV深度学习人脸识别的方法示例
May 14 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
Jul 23 Python
利用pytorch实现对CIFAR-10数据集的分类
Jan 14 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
Feb 17 Python
使用python爬取抖音app视频的实例代码
Dec 01 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
德生PL330测评
2021/03/02 无线电
php实现插入数组但不影响原有顺序的方法
2015/03/27 PHP
PHP时间和日期函数详解
2015/05/08 PHP
PHP二维数组去重算法
2016/12/17 PHP
PHP微信发送推送消息乱码的解决方法
2019/02/28 PHP
javascript iframe中打开文件,并检测iframe存在否
2008/12/28 Javascript
jQuery表单获取和失去焦点输入框提示效果的实例代码
2013/08/01 Javascript
jquery中常用的SET和GET$(”#msg”).html循环介绍
2013/10/09 Javascript
JavaScript作用域与作用域链深入解析
2013/12/06 Javascript
JavaScript中诡异的delete操作符
2015/03/12 Javascript
学习JavaScript鼠标响应事件
2015/12/25 Javascript
JavaScript必知必会(五) eval 的使用
2016/06/08 Javascript
最佳的JavaScript错误处理实践
2016/07/16 Javascript
JavaScript实现复制文章自动添加版权
2016/08/02 Javascript
你不知道的 javascript【推荐】
2017/01/08 Javascript
Node.js操作redis实现添加查询功能
2017/05/25 Javascript
JavaScript之promise_动力节点Java学院整理
2017/07/03 Javascript
激动人心的 Angular HttpClient的源码解析
2017/07/10 Javascript
JavaScript选取(picking)和反选(rejecting)对象的属性方法
2017/08/16 Javascript
JavaScript轮播停留效果的实现思路
2018/05/24 Javascript
微信小程序实现倒计时调用相机自动拍照功能
2018/06/10 Javascript
AngularJS实现动态切换样式的方法分析
2018/06/26 Javascript
小程序封装路由文件和路由方法(5种全解析)
2019/05/26 Javascript
js实现九宫格抽奖
2020/03/19 Javascript
Python三级目录展示的实现方法
2016/09/28 Python
python打包压缩、读取指定目录下的指定类型文件
2018/04/12 Python
python操作ini类型配置文件的实例教程
2020/10/30 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
2021/03/05 HTML / CSS
太阳镜仓库,售价20美元或更少:Sunglass Warehouse
2016/09/28 全球购物
大学校庆策划书
2014/01/31 职场文书
小区物业门卫岗位职责
2014/04/10 职场文书
家长通知书教师评语
2014/04/17 职场文书
小学学校评估方案
2014/06/08 职场文书
交通事故协议书范文
2014/10/23 职场文书
QT连接MYSQL数据库的详细步骤
2021/07/07 MySQL