解决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 相关文章推荐
python定时器使用示例分享
Feb 16 Python
python3生成随机数实例
Oct 20 Python
python 实现一个贴吧图片爬虫的示例
Oct 12 Python
python3 破解 geetest(极验)的滑块验证码功能
Feb 24 Python
numpy.delete删除一列或多列的方法
Apr 03 Python
PyQt5每天必学之布局管理
Apr 19 Python
对Tensorflow中的变量初始化函数详解
Jul 27 Python
使用python将图片按标签分入不同文件夹的方法
Dec 08 Python
Python使用字典实现的简单记事本功能示例
Aug 15 Python
tensorflow如何批量读取图片
Aug 29 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
Feb 28 Python
2021年最新用于图像处理的Python库总结
Jun 15 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
初次接触php抽象工厂模式(Elgg)
2010/03/21 PHP
2个比较经典的PHP加密解密函数分享
2014/07/01 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
2015/04/08 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
2016/11/12 PHP
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
2007/04/12 Javascript
IE之动态添加DOM节点触发window.resize事件
2010/07/27 Javascript
js中使用replace方法完成某个字符的转换
2014/08/20 Javascript
详解js闭包
2014/09/02 Javascript
在浏览器中实现图片粘贴的jQuery插件-- pasteimg使用指南
2014/12/29 Javascript
jQuery中复合属性选择器用法实例
2014/12/31 Javascript
jQuery插件开发精品教程(让你的jQuery更上一个台阶)
2015/11/07 Javascript
js实现select下拉框菜单
2015/12/08 Javascript
理解javascript定时器中的单线程
2016/02/23 Javascript
浅谈JS继承_寄生式继承 &amp; 寄生组合式继承
2016/08/16 Javascript
BootStrap使用file-input插件上传图片的方法
2016/09/05 Javascript
微信小程序 action-sheet底部菜单详解
2016/10/27 Javascript
jQuery基于xml格式数据实现模糊查询及分页功能的方法
2016/12/25 Javascript
详解axios在node.js中的post使用
2017/04/27 Javascript
vue.js开发环境搭建教程
2017/05/04 Javascript
vue 移动端记录页面浏览位置的方法
2020/03/11 Javascript
基于JS实现table导出Excel并保留样式
2020/05/19 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
探寻python多线程ctrl+c退出问题解决方案
2014/10/23 Python
详解python while 函数及while和for的区别
2018/09/07 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
2018/12/14 Python
使用Python pip怎么升级pip
2020/08/11 Python
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
Hotels.com中国区:好订网
2016/08/18 全球购物
物业管理计划书
2014/01/10 职场文书
摄影专业毕业生求职信
2014/03/13 职场文书
建筑专业毕业生求职信
2014/09/30 职场文书
结婚通知短信大全
2015/04/17 职场文书
社区党员干部承诺书
2015/05/04 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
python基础之文件操作
2021/10/24 Python
Python测试框架pytest高阶用法全面详解
2022/06/01 Python