解决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从网络读取图片并直接进行处理的方法
May 22 Python
详解Python的Django框架中的模版继承
Jul 16 Python
django 创建过滤器的实例详解
Aug 14 Python
python Opencv将图片转为字符画
Feb 19 Python
对python for 文件指定行读写操作详解
Dec 29 Python
对python借助百度云API对评论进行观点抽取的方法详解
Feb 21 Python
python变量命名的7条建议
Jul 04 Python
Python如何基于selenium实现自动登录博客园
Dec 16 Python
Python的赋值、深拷贝与浅拷贝的区别详解
Feb 12 Python
Python全局变量与global关键字常见错误解决方案
Oct 05 Python
Django框架之路由用法
Jun 10 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生成excel文件的简单方法
2014/02/08 PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
2014/03/12 PHP
php获取远程文件大小
2015/10/20 PHP
laravel5.4生成验证码的实例讲解
2017/08/05 PHP
PHP抽象类与接口的区别详解
2019/03/21 PHP
PHP 实现base64编码文件上传出现问题详解
2020/09/01 PHP
理解 JavaScript 预解析
2009/10/25 Javascript
基于jQuery的固定表格头部的代码(IE6,7,8测试通过)
2010/05/18 Javascript
javascript字符串替换及字符串分割示例代码
2013/12/12 Javascript
javascript设计模式之中介者模式Mediator
2014/12/30 Javascript
jQuery循环动画与获取组件尺寸的方法
2015/02/02 Javascript
基于Arcgis for javascript实现百度地图ABCD marker的效果
2015/09/12 Javascript
jquery实现的伪分页效果代码
2015/10/29 Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
2016/03/29 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
2016/08/29 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
2017/06/09 Javascript
Vue 2.0学习笔记之使用$refs访问Vue中的DOM
2017/12/19 Javascript
Angular7创建项目、组件、服务以及服务的使用
2019/02/19 Javascript
Vue中的验证登录状态的实现方法
2019/03/09 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
Vue中关闭弹窗组件时销毁并隐藏操作
2020/09/01 Javascript
如何在vue中使用kindeditor富文本编辑器
2020/12/19 Vue.js
python 开发的三种运行模式详细介绍
2017/01/18 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
解决Django layui {{}}冲突的问题
2019/08/29 Python
python 使用elasticsearch 实现翻页的三种方式
2020/07/31 Python
Python利用myqr库创建自己的二维码
2020/11/24 Python
迪卡侬印尼体育用品商店:Decathlon印尼
2020/03/11 全球购物
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
大唐电信科技股份有限公司java工程师面试经历
2016/12/09 面试题
《三峡》教学反思
2014/03/01 职场文书
优秀共产党员先进事迹材料
2014/05/06 职场文书
健康教育评估方案
2014/05/25 职场文书
购房协议书范本
2014/10/02 职场文书
2016公司中秋节寄语
2015/12/07 职场文书
员工安全责任协议书
2016/03/22 职场文书