解决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 相关文章推荐
精确查找PHP WEBSHELL木马的方法(1)
Apr 12 Python
在Python中使用matplotlib模块绘制数据图的示例
May 04 Python
python基础之入门必看操作
Jul 26 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
Dec 11 Python
使用python读取txt文件的内容,并删除重复的行数方法
Apr 18 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
Mar 14 Python
python爬虫之爬取百度音乐的实现方法
Aug 24 Python
Python算法的时间复杂度和空间复杂度(实例解析)
Nov 19 Python
python解析xml文件方式(解析、更新、写入)
Mar 05 Python
python二维图制作的实例代码
Dec 03 Python
用python制作个视频下载器
Feb 01 Python
2021年pycharm的最新安装教程及基本使用图文详解
Apr 03 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设计模式之命令模式的应用详解
2013/05/21 PHP
php获取淘宝分类id示例
2014/01/16 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
Laravel实现自定义错误输出内容的方法
2016/10/10 PHP
PHP缓存工具XCache安装与使用方法详解
2018/04/09 PHP
关于Curl在Swoole协程中的解决方案详析
2019/09/12 PHP
javascript[js]获取url参数的代码
2007/10/17 Javascript
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
node.js中的events.emitter.once方法使用说明
2014/12/10 Javascript
JavaScript数据类型检测代码分享
2015/01/26 Javascript
JavaScript中的分号插入机制详细介绍
2015/02/11 Javascript
JS实现带缓冲效果打开、关闭、移动一个层的方法
2015/05/09 Javascript
jquery获取文档高度和窗口高度汇总
2016/01/25 Javascript
jQuery+CSS3实现仿花瓣网固定顶部位置带悬浮效果的导航菜单
2016/09/21 Javascript
微信小程序 倒计时组件实现代码
2016/10/24 Javascript
移动适配的几种方案(三种方案)
2016/11/25 Javascript
vue.js绑定class和style样式(6)
2016/12/09 Javascript
Vue数字输入框组件的使用方法
2019/10/19 Javascript
CKEditor扩展插件:自动排版功能autoformat插件实现方法详解
2020/02/06 Javascript
Python中的is和id用法分析
2015/01/26 Python
python实现端口转发器的方法
2015/03/13 Python
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
深入理解python多进程编程
2016/06/12 Python
Python 通配符删除文件的实例
2018/04/24 Python
python中in在list和dict中查找效率的对比分析
2018/05/04 Python
使用Python实现毫秒级抢单功能
2019/06/06 Python
Python全栈之列表数据类型详解
2019/10/01 Python
Numpy中ndim、shape、dtype、astype的用法详解
2020/06/14 Python
keras的backend 设置 tensorflow,theano操作
2020/06/30 Python
Doyoueven官网:澳大利亚健身服饰和配饰品牌
2019/03/24 全球购物
.NET程序员的数据库面试题
2012/10/10 面试题
生物化工专业个人自荐信
2013/09/26 职场文书
计算机专业大学生的自我评价
2013/11/14 职场文书
运动会通讯稿400字
2014/01/28 职场文书
大学校庆策划书
2014/01/31 职场文书
Golang 并发编程 SingleFlight模式
2022/04/26 Golang