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实现文件分组复制到不同目录的例子
Jun 04 Python
python自动翻译实现方法
May 28 Python
Windows下Python使用Pandas模块操作Excel文件的教程
May 31 Python
Python中关键字nonlocal和global的声明与解析
Mar 12 Python
对pandas的算术运算和数据对齐实例详解
Dec 22 Python
python3实现钉钉消息推送的方法示例
Mar 14 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
Aug 13 Python
softmax及python实现过程解析
Sep 30 Python
python 生成器和迭代器的原理解析
Oct 12 Python
python实现上传文件到linux指定目录的方法
Jan 03 Python
Python命令行参数定义及需要注意的地方
Nov 30 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
Jan 06 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
PHP url 加密解密函数代码
2011/08/26 PHP
php验证码实现代码(3种)
2015/09/07 PHP
php生成无限栏目树
2017/03/16 PHP
php命令行写shell实例详解
2018/07/19 PHP
jQuery.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
2011/07/28 Javascript
js中substring和substr的详细介绍与用法
2013/08/29 Javascript
JavaScript中使用ActiveXObject操作本地文件夹的方法
2014/03/28 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
BootStrap中关于Select下拉框选择触发事件及扩展
2016/11/22 Javascript
Bootstrap table使用方法详细介绍
2016/12/09 Javascript
利用node.js搭建简单web服务器的方法教程
2017/02/20 Javascript
react实现同页面三级跳转路由布局
2019/09/26 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
2019/10/31 Javascript
JS 数组和对象的深拷贝操作示例
2020/06/06 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
[32:07]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第一场 12.16
2020/12/17 DOTA
Pycharm学习教程(3) 代码运行调试
2017/05/03 Python
Python模块的制作方法实例分析
2019/12/21 Python
django创建超级用户时指定添加其它字段方式
2020/05/14 Python
Python依赖包迁移到断网环境操作
2020/07/13 Python
浅谈对python中if、elif、else的误解
2020/08/20 Python
意大利火车票和铁路通行证专家:ItaliaRail
2019/01/22 全球购物
工商管理专业应届生求职信
2013/11/04 职场文书
获奖的大学生创业计划书
2014/01/05 职场文书
售后服务经理岗位职责
2014/02/25 职场文书
2014年乡镇植树节活动方案
2014/02/28 职场文书
社区食品安全实施方案
2014/03/28 职场文书
高校师德师风自我剖析材料
2014/09/29 职场文书
银行授权委托书格式
2014/10/10 职场文书
2014年护士工作总结范文
2014/11/11 职场文书
防汛通知
2015/04/25 职场文书
指导老师鉴定意见
2015/06/05 职场文书
公司年会主持词范文!
2019/05/07 职场文书
Java SSH 秘钥连接mysql数据库的方法
2021/06/28 Java/Android
一些让Python代码简洁的实用技巧总结
2021/08/23 Python
分析SQL窗口函数之取值窗口函数
2022/04/21 Oracle