解决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中查看文件名和文件路径
Mar 31 Python
Python设计实现的计算器功能完整实例
Aug 18 Python
python爬虫爬取网页表格数据
Mar 07 Python
python 读取文件并替换字段的实例
Jul 12 Python
python selenium 弹出框处理的实现
Feb 26 Python
python 上下文管理器及自定义原理解析
Nov 19 Python
python中count函数简单的实例讲解
Feb 06 Python
Python操作Jira库常用方法解析
Apr 10 Python
在tensorflow以及keras安装目录查询操作(windows下)
Jun 19 Python
使用Python爬取小姐姐图片(beautifulsoup法)
Feb 11 Python
Python中的socket网络模块介绍
Jul 23 Python
Python中的 No Module named ***问题及解决
Jul 23 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
destoon网站转移服务器后搜索汉字出现乱码的解决方法
2014/06/21 PHP
laravel5.4生成验证码的实例讲解
2017/08/05 PHP
Laravel框架下的Contracts契约详解
2020/03/17 PHP
js隐藏与显示回到顶部按钮及window.onscroll事件应用
2013/01/25 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
javaScript的函数对象的声明详解
2015/02/06 Javascript
理解javascript中的原型和原型链
2015/07/30 Javascript
AngularJs学习第五篇从Controller控制器谈谈$scope作用域
2016/06/08 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
2016/10/21 Javascript
vue中如何引入jQuery和Bootstrap
2017/04/10 jQuery
详解webpack 多入口配置
2017/06/16 Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
2018/06/19 Javascript
vue内置组件transition简单原理图文详解(小结)
2018/07/12 Javascript
Vue项目History模式404问题解决方法
2018/10/31 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
2019/02/15 Javascript
vue 使用element-ui中的Notification自定义按钮并实现关闭功能及如何处理多个通知
2019/08/17 Javascript
Python使用Flask框架同时上传多个文件的方法
2015/03/21 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
Django contenttypes 框架详解(小结)
2018/08/13 Python
python 判断矩阵中每行非零个数的方法
2019/01/26 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
Django REST Framework之频率限制的使用
2019/09/29 Python
Python 限定函数参数的类型及默认值方式
2019/12/24 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
2020/01/08 Python
Python3 filecmp模块测试比较文件原理解析
2020/03/23 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
洲际酒店集团英国官网:IHG英国
2019/07/10 全球购物
主管职责范文
2013/11/09 职场文书
高中生学习生活的自我评价
2013/11/27 职场文书
大学生开西餐厅创业计划书
2014/02/01 职场文书
教师个人剖析材料
2014/02/05 职场文书
早读课迟到检讨书
2014/09/25 职场文书
Oracle数据库中通用的函数实例详解
2022/03/25 Oracle
前端canvas中物体边框和控制点的实现示例
2022/08/05 Javascript