解决python super()调用多重继承函数的问题


Posted in Python onJune 26, 2019

当类间继承关系很简单时,super()的使用很简单。

class A(object):
 def __init__(self):
  print('a')
 
 
class B(A):
 def __init__(self):
  super(B, self).__init__()
  print('b')
 
b = B()

输出结果:

a
b

当一个类继承多个类时,问题就复杂起来了,请看下例:

class A(object):
 def __init__(self):
  print('a')
 
 
class B(object):
 def __init__(self):
  print('b')
  
  
class C(A, B):
 def __init__(self):
  super(C, self).__init__()
  print('c')
 
c = C()

咋一看,情况好像也不复杂,结果输出a, c嘛。没错!但是如果C类想同时调用A与B的__init__()呢?

有童鞋就要说了,我显示调用不就OK了嘛?

class A(object):
 def __init__(self):
  print('a')
 
 
class B(object):
 def __init__(self):
  print('b')
  
  
class C(A, B):
 def __init__(self):
  A.__init__()
  B.__init__()
  print('c')
 
c = C()

效果一样,还不够好。因为没有调用super(),super的一大好处在于,当父类的名字修改时,其继承类不用修改调用方法。

下面给出完美解决方案:

class A(object):
 def __init__(self):
  super(A, self).__init__()
  print('a')
 
 
class B(object):
 def __init__(self):
  super(B, self).__init__()
  print('b')
 
 
class C(A, B):
 def __init__(self):
  super(C, self).__init__()
  print('c')
 
print(C.mro())
c = C()

print(C.mro()),在实际中可以去掉,为啥写在这里,后面再说。

输出结果:

[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <type 'object'>]
b
a
c

注意:输出结果是b, a, c 而非a, b, c。为什么?

这里就要用上面的mro()输出来解释了。MRO全称Method Resolution Order, 就是用来定义继承方法的调用顺序,自Python2.3以来,MRO采用广度优先(区别于深度优先)的规则定义。按广度优先的规则,出来的顺序就是:

[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <type 'object'>]

而每次调用super()则是,调用MRO中下一个函数。上面的例子中:super(C, self)则指向MRO中的下一个类(A), 于是调用A的init --> 在A的init中,又调用了super(),于是调用MRO中的下一个函数(B) --> B调用下一个(object), object啥也不干 --> 返回B中,print('b') --> 返回A中,print('a') --> 返回C中,print('c')。

这里再次强调一次,super(type, obj).func()函数调用的是,obj实例在MRO中下一个父类的可调用func(),而不是type的父类中的func()(这个是本文第一个示例给你带来的错觉)。

以上这篇解决python super()调用多重继承函数的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python3.6简单操作Mysql数据库
Sep 12 Python
学习python中matplotlib绘图设置坐标轴刻度、文本
Feb 07 Python
Python+Pandas 获取数据库并加入DataFrame的实例
Jul 25 Python
python处理两种分隔符的数据集方法
Dec 12 Python
Django REST framework视图的用法
Jan 16 Python
Python3爬楼梯算法示例
Mar 04 Python
对Python强大的可变参数传递机制详解
Jun 13 Python
python中metaclass原理与用法详解
Jun 25 Python
django 数据库 get_or_create函数返回值是tuple的问题
May 15 Python
Python基于正则表达式实现计算器功能
Jul 13 Python
Python 的 __str__ 和 __repr__ 方法对比
Sep 02 Python
Python 多进程原理及实现
Dec 21 Python
Python实现获取系统临时目录及临时文件的方法示例
Jun 26 #Python
python里dict变成list实例方法
Jun 26 #Python
Python音频操作工具PyAudio上手教程详解
Jun 26 #Python
python3中类的继承以及self和super的区别详解
Jun 26 #Python
对Python中class和instance以及self的用法详解
Jun 26 #Python
Python中的支持向量机SVM的使用(附实例代码)
Jun 26 #Python
对python 中class与变量的使用方法详解
Jun 26 #Python
You might like
浅析51个PHP处理字符串的函数
2013/08/02 PHP
yii的CURD操作实例详解
2014/12/04 PHP
php继承中方法重载(覆盖)的应用场合
2015/02/09 PHP
PHP使用mysqli操作MySQL数据库的简单方法
2017/02/04 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
将两个div左右并列显示并实现点击标题切换内容
2013/10/22 Javascript
表单提交前触发函数返回true表单才会提交
2014/03/11 Javascript
jQuery实现的多选框多级联动插件
2014/05/02 Javascript
javascript实现简单的鼠标拖动效果实例
2015/04/10 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
js遮罩效果制作弹出注册界面效果
2017/01/25 Javascript
详解node服务器中打开html文件的两种方法
2017/09/18 Javascript
JavaScript模块模式实例详解
2017/10/25 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
2017/12/15 Javascript
vue 配置多页面应用的示例代码
2018/10/22 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
[01:20:47]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第一场 1月19日
2021/03/11 DOTA
Python中的字典遍历备忘
2015/01/17 Python
Python交互式图形编程的实现
2019/07/25 Python
python解析yaml文件过程详解
2019/08/30 Python
python实现滑雪者小游戏
2020/02/22 Python
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
大学毕业生最详细的自我评价分享
2013/11/18 职场文书
护士见习期自我鉴定
2014/02/08 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
婚礼双方父亲致辞
2015/07/27 职场文书
学校运动会开幕词
2016/03/03 职场文书
公证书
2019/04/17 职场文书
2019年教师节:送给所有老师的祝福语
2019/09/05 职场文书
TV动画「神渣☆爱豆」公开第一弹主视觉图
2022/03/21 日漫
总结三种用 Python 作为小程序后端的方式
2022/05/02 Python
python blinker 信号库
2022/05/04 Python
Redis 报错 error:NOAUTH Authentication required
2022/05/15 Redis
Python创建SQL数据库流程逐步讲解
2022/09/23 Python