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回溯法实现数组全排列输出实例分析
Mar 17 Python
python检查字符串是否是正确ISBN的方法
Jul 11 Python
Python实现递归遍历文件夹并删除文件
Apr 18 Python
Python selenium文件上传方法汇总
Nov 19 Python
使用Python的package机制如何简化utils包设计详解
Dec 11 Python
在python中利用KNN实现对iris进行分类的方法
Dec 11 Python
浅谈Python批处理文件夹中的txt文件
Mar 11 Python
Django网络框架之创建虚拟开发环境操作示例
Jun 06 Python
用Python+OpenCV对比图像质量的几种方法
Jul 15 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
Jul 23 Python
Python xlrd模块导入过程及常用操作
Jun 10 Python
python 多线程中join()的作用
Oct 29 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
关于Appserv无法打开localhost问题的解决方法
2009/10/16 PHP
通用PHP动态生成静态HTML网页的代码
2010/03/04 PHP
洪恩在线成语词典小偷程序php版
2012/04/20 PHP
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
IE下Ajax缓存问题的快速解决方法(get方式)
2014/01/09 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
jQuery on()绑定动态元素出现的问题小结
2016/02/19 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
Vue组件BootPage实现简单的分页功能
2016/09/12 Javascript
浅谈jquery页面初始化的4种方式
2016/11/27 Javascript
ionic2打包android时gradle无法下载的解决方法
2017/04/05 Javascript
JS点击缩略图整屏居中放大图片效果
2017/07/04 Javascript
AngularJS ionic手势事件的使用总结
2017/08/09 Javascript
jQuery中元素选择器(element)简单用法示例
2018/05/14 jQuery
微信小程序自定义多选事件的实现代码
2018/05/17 Javascript
vue js秒转天数小时分钟秒的实例代码
2018/08/08 Javascript
Vue 实现展开折叠效果的示例代码
2018/08/27 Javascript
基于axios 解决跨域cookie丢失的问题
2018/09/26 Javascript
vue实现父子组件之间的通信以及兄弟组件的通信功能示例
2019/01/29 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
2019/08/02 jQuery
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
node.js +mongdb实现登录功能
2020/06/18 Javascript
python:按行读入,排序然后输出的方法
2019/07/20 Python
利用Python库Scapy解析pcap文件的方法
2019/07/23 Python
用Cython加速Python到“起飞”(推荐)
2019/08/01 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
2020/04/21 Python
h5移动端调用支付宝、微信支付的实现
2020/06/08 HTML / CSS
购买限量版收藏品、珠宝和礼品:Bradford Exchange
2016/09/23 全球购物
经典导游欢迎词大全
2014/01/16 职场文书
文员的职业生涯规划发展方向
2014/02/08 职场文书
毕业班联欢会主持词
2014/03/27 职场文书
文明之星事迹材料
2014/05/09 职场文书
百日宴上的祝酒词
2015/08/10 职场文书
创业不要错过,这4种餐饮新模式
2019/07/18 职场文书
Linux系统下MySQL配置主从分离的步骤
2022/03/21 MySQL
SQL Server中的游标介绍
2022/05/20 SQL Server