解决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字符串拼接六种方法介绍
Dec 18 Python
pandas数据处理基础之筛选指定行或者指定列的数据
May 03 Python
编写多线程Python服务器 最适合基础
Sep 14 Python
Django csrf 验证问题的实现
Oct 09 Python
python变量赋值方法(可变与不可变)
Jan 12 Python
python3.5安装python3-tk详解
Apr 26 Python
pyqt5 使用label控件实时显示时间的实例
Jun 14 Python
python字典改变value值方法总结
Jun 21 Python
django 利用Q对象与F对象进行查询的实现
May 15 Python
详解Python 中的容器 collections
Aug 17 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
Nov 22 Python
python 模拟在天空中放风筝的示例代码
Apr 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
PHP聊天室技术
2006/10/09 PHP
PHP7常量数组用法分析
2016/09/26 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
2017/06/12 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
PHP之header函数详解
2021/03/02 PHP
调用js时ie6和ie7,ff的区别
2009/08/19 Javascript
如何使用json在前后台进行数据传输实例介绍
2013/04/11 Javascript
js简单的弹出框有关闭按钮
2014/05/05 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
2014/06/07 Javascript
JavaScript AOP编程实例
2015/06/16 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
2015/09/24 Javascript
关于JS与jQuery中的文档加载问题
2017/08/22 jQuery
删除table表格行的实例讲解
2017/09/21 Javascript
vue 过滤器filter实例详解
2018/03/14 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
2018/08/19 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
2019/05/31 Javascript
javascript实现超好看的3D烟花特效
2020/01/01 Javascript
解决vue自定义指令导致的内存泄漏问题
2020/08/04 Javascript
jQuery实现tab栏切换效果
2020/12/22 jQuery
六个窍门助你提高Python运行效率
2015/06/09 Python
Python实现模拟分割大文件及多线程处理的方法
2017/10/10 Python
pytorch 在sequential中使用view来reshape的例子
2019/08/20 Python
python实现在内存中读写str和二进制数据代码
2020/04/24 Python
Python3自动生成MySQL数据字典的markdown文本的实现
2020/05/07 Python
Python如何使用ElementTree解析xml
2020/10/12 Python
Html5上传图片 移动端、PC端通用代码
2016/06/08 HTML / CSS
最便宜促销价格订机票:Airpaz(总部设在印尼,支持中文)
2018/11/13 全球购物
Jack Rogers官网:美国经典的女性鞋靴品牌
2019/09/04 全球购物
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
七年级上册语文教学计划
2015/01/22 职场文书
刑事案件上诉状
2015/05/23 职场文书
小学少先队工作总结2015
2015/05/26 职场文书
初二数学教学反思
2016/02/17 职场文书
优秀党员先进事迹材料2016
2016/02/29 职场文书
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers
Python 数据可视化之Matplotlib详解
2021/11/02 Python