Python super()函数使用及多重继承


Posted in Python onMay 06, 2020

super()函数可以用于继承父类的方法,语法如下:

super(type[, object-or-type])

虽然super()函数的使用比较简单,但是需要根据单继承和多继承来分析函数的调用关系。

首先,当类之间的继承关系为单继承时,函数调用关系也比较简单,可以参考如下的例子:

#!/usr/bin/env python3

class A(object):
  def __init__(self):
    print('class A')

class B(A):
  def __init__(self):
    super(B, self).__init__()
    print('class B')

b = B()

上述代码运行结果如下:

class A
class B

从结果可以看出,子类B在实例化时调用了父类A的__init__()方法。

当进行多重继承时,需要考虑MRO的问题。所谓MRO,即Method Resolution Order,自Python2.3以来,MRO采用广度优先(区别于深度优先)的规则定义。为了更好的理解这个问题,让我们先来看如下的代码:

#!/usr/bin/env python3

class A(object):
  def __init__(self):
    self.n = 10
  
  def minus(self, m):
    print('minus in class A start')
    self.n -= m
    print('minus in class A end')

class B(A):
  def __init__(self):
    self.n = 7

  def minus(self, m):
    print('minus in class B start')
    super(B, self).minus(m)
    self.n -= 2
    print('minus in class B end')

class C(A):
  def __init__(self):
    self.n = 12

  def minus(self, m):
    print('minus in class C start')
    super(C, self).minus(m)
    self.n -= 5
    print('minus in class C end')

class D(B,C):
  def __init__(self):
    self.n = 15

  def minus(self, m):
    print('minus in class D start')
    super(D, self).minus(m)
    self.n -= 2
    print('minus in class D end')

print('The MRO of class D is :')
print(D.__mro__)

d = D()
d.minus(2)
print(d.n)

代码运行结果:

The MRO of class D is :
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
minus in class D start
minus in class B start
minus in class C start
minus in class A start
minus in class A end
minus in class C end
minus in class B end
minus in class D end
4

从运行结果可以看出,子类D的MRO为(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>),也就是子类D的minus函数在调用父类函数时的调用顺序依次为BCA,而后续的调试打印信息也正好验证了该顺序。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
高性能web服务器框架Tornado简单实现restful接口及开发实例
Jul 16 Python
Python迭代器和生成器定义与用法示例
Feb 10 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
Apr 17 Python
Python装饰器知识点补充
May 28 Python
python的pip安装以及使用教程
Sep 18 Python
Python判断telnet通不通的实例
Jan 26 Python
python二维码操作:对QRCode和MyQR入门详解
Jun 24 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
Feb 17 Python
Python中sys模块功能与用法实例详解
Feb 26 Python
PIP和conda 更换国内安装源的方法步骤
Sep 21 Python
python如何利用traceback获取详细的异常信息
Jun 05 Python
详解Golang如何实现支持随机删除元素的堆
Sep 23 Python
python中shell执行知识点
May 06 #Python
Python 通过监听端口实现唯一脚本运行方式
May 05 #Python
python2.7使用scapy发送syn实例
May 05 #Python
python 使用raw socket进行TCP SYN扫描实例
May 05 #Python
Python之变量类型和if判断方式
May 05 #Python
Python实现CAN报文转换工具教程
May 05 #Python
python TCP包注入方式
May 05 #Python
You might like
收音机的保养
2021/03/01 无线电
遍历指定目录下的所有目录和文件的php代码
2011/11/27 PHP
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
Apache服务器下防止图片盗链的办法
2015/07/06 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
JavaScript中常见陷阱小结
2010/04/27 Javascript
JS扩展方法实例分析
2015/04/15 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
jQuery+PHP+MySQL实现无限级联下拉框效果
2016/02/19 Javascript
超详细的JS弹出窗口代码大全
2020/04/18 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
React利用插件和不用插件实现双向绑定的方法详解
2017/07/03 Javascript
详解Vue内部怎样处理props选项的多种写法
2018/11/06 Javascript
vue自定义表单生成器form-create使用详解
2019/07/19 Javascript
vue+element表格导出为Excel文件
2019/09/26 Javascript
Node.js控制台彩色输出的方法与原理实例详解
2019/12/01 Javascript
node.js文件的复制、创建文件夹等相关操作
2021/02/05 Javascript
[33:15]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VP VS Mineski
2018/03/31 DOTA
[00:32]2018DOTA2亚洲邀请赛Newbee出场
2018/04/03 DOTA
python在命令行下使用google翻译(带语音)
2014/01/16 Python
Python用 KNN 进行验证码识别的实现方法
2018/02/06 Python
python移位运算的实现
2019/07/15 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
实习教师自我鉴定
2013/12/12 职场文书
先进德育工作者事迹材料
2014/01/24 职场文书
应届毕业生应聘自荐信范文
2014/02/26 职场文书
高一课前三分钟演讲稿
2014/09/13 职场文书
2014校长四风问题对照检查材料思想汇报
2014/09/16 职场文书
堂吉诃德读书笔记
2015/06/30 职场文书
初中班级口号霸气押韵
2015/12/24 职场文书
九年级化学教学反思
2016/02/22 职场文书
JS如何实现基于websocket的多端桥接平台
2021/05/14 Javascript