解决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 + openpyxl处理excel2007文档思路以及心得
Jul 14 Python
Python contextlib模块使用示例
Feb 18 Python
Python利用Beautiful Soup模块创建对象详解
Mar 27 Python
python opencv实现切变换 不裁减图片
Jul 26 Python
python中将zip压缩包转为gz.tar的方法
Oct 18 Python
python pyheatmap包绘制热力图
Nov 09 Python
Python 画出来六维图
Jul 26 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
Sep 20 Python
python 画函数曲线示例
Dec 04 Python
python时间与Unix时间戳相互转换方法详解
Feb 13 Python
解决import tensorflow as tf 出错的原因
Apr 16 Python
Python Matplotlib绘制等高线图与渐变色扇形图
Apr 14 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
PHP中的cookie
2006/11/26 PHP
php生成缩略图示例代码分享(使用gd库实现)
2014/01/20 PHP
php通过修改header强制图片下载的方法
2015/03/24 PHP
PHP框架性能测试报告
2016/05/08 PHP
PHP实现判断数组是一维、二维或几维的方法
2017/02/06 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
2017/11/06 PHP
TP5.0框架实现无限极回复功能的方法分析
2019/05/04 PHP
HTML TO JavaScript 转换
2006/06/26 Javascript
JavaScript入门教程 Cookies
2009/01/31 Javascript
jquery 可排列的表实现代码
2009/11/13 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
Ext中下拉列表ComboBox组件store数据格式用法介绍
2013/07/15 Javascript
jquery动态增加删除表格行的小例子
2013/11/14 Javascript
JSON格式的键盘编码对照表
2015/01/29 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
2015/10/15 Javascript
javascript从定义到执行 你不知道的那些事
2016/01/04 Javascript
Javascript中浏览器窗口的基本操作总结
2016/08/18 Javascript
JS实现电商放大镜效果
2017/08/24 Javascript
js 只比较时间大小的实例
2017/10/26 Javascript
javascript实现雪花飘落效果
2020/08/19 Javascript
如何在VUE中使用vue-awesome-swiper
2021/01/04 Vue.js
Django权限机制实现代码详解
2018/02/05 Python
python的pandas工具包,保存.csv文件时不要表头的实例
2018/06/14 Python
flask-socketio实现WebSocket的方法
2018/07/31 Python
Python之列表实现栈的工作功能
2019/01/28 Python
NumPy 数组使用大全
2019/04/25 Python
使用python 将图片复制到系统剪贴中
2019/12/13 Python
详细分析Python可变对象和不可变对象
2020/07/09 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
浅谈CSS3特性查询(Feature Query: @supports)功能简介
2017/07/31 HTML / CSS
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
LUISAVIAROMA德国官网:时尚奢侈品牌购物网站
2020/11/12 全球购物
社区爱国卫生月活动总结
2014/06/30 职场文书
张丽莉观后感
2015/06/16 职场文书
如何书写先进事迹材料?
2019/07/02 职场文书