解决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多线程和队列操作实例
Jun 21 Python
python web框架学习笔记
May 03 Python
python微信公众号开发简单流程
Mar 23 Python
Python集中化管理平台Ansible介绍与YAML简介
Jun 12 Python
pyqt5 从本地选择图片 并显示在label上的实例
Jun 13 Python
浅析Python 条件控制语句
Jul 15 Python
selenium切换标签页解决get超时问题的完整代码
Aug 30 Python
python用Tkinter做自己的中文代码编辑器
Sep 07 Python
利用python汇总统计多张Excel
Sep 22 Python
详解Python Celery和RabbitMQ实战教程
Jan 20 Python
python基于turtle绘制几何图形
Jun 15 Python
Python实现Hash算法
Mar 18 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实现MySQL更新记录的代码
2008/06/07 PHP
php中替换字符串中的空格为逗号','的方法
2014/06/09 PHP
js 方法实现返回多个数据的代码
2009/04/30 Javascript
js操作CheckBoxList实现全选/反选(在客服端完成)
2013/02/02 Javascript
js完美的div拖拽实例代码
2014/01/22 Javascript
悬浮数字的实现案例
2014/02/19 Javascript
json实现前后台的相互传值详解
2015/01/05 Javascript
JS+CSS实现闪烁字体效果代码
2016/04/05 Javascript
jQuery 3.0 的 setter和getter 模式详解
2016/07/11 Javascript
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
详解Angular2响应式表单
2017/06/14 Javascript
node实现基于token的身份验证
2018/04/09 Javascript
基于JS实现html中placeholder属性提示文字效果示例
2018/04/19 Javascript
Vue filter格式化时间戳时间成标准日期格式的方法
2018/09/16 Javascript
从0到1构建vueSSR项目之路由的构建
2019/03/07 Javascript
Vue+Typescript中在Vue上挂载axios使用时报错问题
2019/08/07 Javascript
解决layui动态添加的元素click等事件触发不了的问题
2019/09/20 Javascript
Layui事件监听的实现(表单和数据表格)
2019/10/17 Javascript
Node配合WebSocket做多文件下载以及进度回传
2019/11/07 Javascript
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
[04:29]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/02/01 DOTA
Python中使用pprint函数进行格式化输出的教程
2015/04/07 Python
Python读取图片属性信息的实现方法
2016/09/11 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
2020/08/31 Python
详解python模块pychartdir安装及导入问题
2020/10/22 Python
Django-celery-beat动态添加周期性任务实现过程解析
2020/11/26 Python
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
德国宠物用品、宠物食品及水族馆网上商店:ZooRoyal
2017/07/09 全球购物
Bata印度官网:源自欧洲舒适鞋履品牌
2020/01/30 全球购物
交通志愿者活动总结
2014/06/27 职场文书
母亲去世追悼词
2015/06/23 职场文书
《祁黄羊》教学反思
2016/02/20 职场文书
初中生入团申请书范文(五篇)
2019/10/16 职场文书
yolov5返回坐标的方法实例
2022/03/17 Python
MySQL普通表如何转换成分区表
2022/05/30 MySQL