解决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中统计函数运行耗时的方法
May 05 Python
Python读取视频的两种方法(imageio和cv2)
Apr 15 Python
python list是否包含另一个list所有元素的实例
May 04 Python
解决Python selenium get页面很慢时的问题
Jan 30 Python
Python JSON格式数据的提取和保存的实现
Mar 22 Python
Linux下远程连接Jupyter+pyspark部署教程
Jun 21 Python
python查找重复图片并删除(图片去重)
Jul 16 Python
python的flask框架难学吗
Jul 31 Python
如何利用Python 进行边缘检测
Oct 14 Python
Python可以用来做什么
Nov 23 Python
python实现双人五子棋(终端版)
Dec 30 Python
Python实现信息轰炸工具(再也不怕说不过别人了)
Jun 11 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学习笔记之三 数据库基本操作
2011/01/17 PHP
php中实现可以返回多个值的函数实例
2015/03/21 PHP
[原创]php简单防盗链验证实现方法
2016/07/09 PHP
PHP实现分布式memcache设置web集群session同步的方法
2018/04/10 PHP
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
JS中prototype关键字的功能介绍及使用示例
2013/07/21 Javascript
JavaScript及jquey实现多个数组的合并操作
2014/09/06 Javascript
分分钟玩转Vue.js组件(二)
2017/03/01 Javascript
教你用Cordova打包Vue项目的方法
2017/10/17 Javascript
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
2018/05/10 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
koa router 多文件引入的方法示例
2019/05/22 Javascript
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
用Golang运行JavaScript的实现示例
2019/11/25 Javascript
js实现QQ邮箱邮件拖拽删除功能
2020/08/27 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
2020/11/04 Javascript
Python中实现三目运算的方法
2015/06/21 Python
Python正则简单实例分析
2017/03/21 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
2019/04/29 Python
pybind11和numpy进行交互的方法
2019/07/04 Python
python networkx 包绘制复杂网络关系图的实现
2019/07/10 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
2019/08/26 Python
Pandas实现一列数据分隔为两列
2020/05/18 Python
美国优质马术服装购买网站:Breeches.com
2019/12/16 全球购物
美国电子产品购物网站:BuyDig.com
2020/06/17 全球购物
简述安装Slackware Linux系统的过程
2012/01/12 面试题
JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
2015/10/22 面试题
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
学生喝酒检讨书
2014/02/06 职场文书
领导干部民主生活会自我剖析材料范文
2014/09/20 职场文书
大队委员竞选稿
2015/11/20 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技
讲解MySQL增删改操作
2022/05/06 MySQL
win10如何快速切换窗口 win10切换窗口快捷键分享
2022/07/23 数码科技