解决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
Python读取键盘输入的2种方法
Jun 16 Python
python如何实现excel数据添加到mongodb
Jul 30 Python
python实现八大排序算法(2)
Sep 14 Python
你眼中的Python大牛 应该都有这份书单
Oct 31 Python
使用Pandas将inf, nan转化成特定的值
Dec 19 Python
python每5分钟从kafka中提取数据的例子
Dec 23 Python
Python使用正则实现计算字符串算式
Dec 29 Python
python 通过文件夹导入包的操作
Jun 01 Python
python ssh 执行shell命令的示例
Sep 29 Python
Python实现PS滤镜中的USM锐化效果
Dec 04 Python
Python 中的 copy()和deepcopy()
Nov 07 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
substr()函数中文版
2006/10/09 PHP
生成静态页面的PHP类
2006/11/25 PHP
PHP 常用函数库和一些实用小技巧
2009/01/01 PHP
PHP连接SQLServer2005方法及代码
2013/12/26 PHP
非常实用的PHP常用函数汇总
2014/12/17 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
统计jQuery中各字符串出现次数的工具
2012/05/03 Javascript
用js写了一个类似php的print_r输出换行功能
2013/02/18 Javascript
jQuery关于导航条背景切换效果实现示例
2013/09/04 Javascript
JavaScript遍历table表格中的某行某列并打印其值
2014/07/08 Javascript
jquery、js调用iframe父窗口与子窗口元素的方法整理
2014/07/31 Javascript
使用纯javascript实现经典扫雷游戏
2015/04/23 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
在IE8上JS实现combobox支持拼音检索功能
2016/05/23 Javascript
纯JS实现图片验证码功能并兼容IE6-8(推荐)
2017/04/19 Javascript
详解HTTPS 的原理和 NodeJS 的实现
2017/07/04 NodeJs
vue源码学习之Object.defineProperty对象属性监听
2018/05/30 Javascript
图文详解vue框架安装步骤
2019/02/12 Javascript
关于AOP在JS中的实现与应用详解
2019/05/06 Javascript
利用Vue实现一个markdown编辑器实例代码
2019/05/19 Javascript
Python 自动化表单提交实例代码
2017/06/08 Python
详解Django之admin组件的使用和源码剖析
2018/05/04 Python
浅析Windows 嵌入python解释器的过程
2019/07/26 Python
Python实现生成密码字典的方法示例
2019/09/02 Python
Python的缺点和劣势分析
2019/11/19 Python
python orm 框架中sqlalchemy用法实例详解
2020/02/02 Python
关于Python字符串显示u...的解决方式
2020/03/06 Python
Django模板获取field的verbose_name实例
2020/05/19 Python
Python从MySQL数据库中面抽取试题,生成试卷
2021/01/14 Python
优质美利奴羊毛袜,不只是徒步旅行:Darn Tough Vermont
2018/11/05 全球购物
沃达丰英国有限公司:Vodafone英国
2019/04/16 全球购物
粗加工管理制度
2014/02/04 职场文书
空中乘务员岗位职责
2014/03/08 职场文书
思想政治表现评语
2015/01/04 职场文书
解决Pytorch中关于model.eval的问题
2021/05/22 Python