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 相关文章推荐
Python中MySQL数据迁移到MongoDB脚本的方法
Apr 28 Python
Pandas 数据处理,数据清洗详解
Jul 10 Python
python3安装speech语音模块的方法
Dec 24 Python
Python的UTC时间转换讲解
Feb 26 Python
python实现爬山算法的思路详解
Apr 09 Python
pyqt5 实现在别的窗口弹出进度条
Jun 18 Python
基于django传递数据到后端的例子
Aug 16 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
Oct 14 Python
python3操作注册表的方法(Url protocol)
Feb 05 Python
aws 通过boto3 python脚本打pach的实现方法
May 10 Python
简单了解Python变量作用域正确使用方法
Jun 12 Python
浅谈Python数学建模之整数规划
Jun 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
thinkphp隐藏index.php/home并允许访问其他模块的实现方法
2016/10/13 PHP
php中bind_param()函数用法分析
2017/03/28 PHP
Laravel重定向,a链接跳转,控制器跳转示例
2019/10/22 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
PHP论坛实现积分系统的思路代码详解
2020/06/01 PHP
js树形控件脚本代码
2008/07/24 Javascript
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
屏蔽F1~F12的快捷键的js函数
2010/05/06 Javascript
JS Map 和 List 的简单实现代码
2013/07/08 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
详解Bootstrap按钮
2016/01/04 Javascript
JavaScript模板引擎Template.js使用详解
2016/12/15 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
2018/04/10 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置
2019/05/27 Javascript
使用node.JS中的url模块解析URL信息
2020/02/06 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
2020/04/23 Javascript
[04:13]2018国际邀请赛典藏宝瓶Ⅱ饰品一览
2018/07/21 DOTA
浅谈Python实现2种文件复制的方法
2018/01/19 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
2018/03/14 Python
使用Python画股票的K线图的方法步骤
2019/06/28 Python
python word转pdf代码实例
2019/08/16 Python
关于pytorch中全连接神经网络搭建两种模式详解
2020/01/14 Python
Python 炫技操作之合并字典的七种方法
2020/04/10 Python
Python通过kerberos安全认证操作kafka方式
2020/06/06 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
触发器(trigger)的功能都有哪些?写出一个触发器的例子
2012/09/17 面试题
UML设计模式笔试题
2014/06/07 面试题
初中三年毕业生的自我评价分享
2014/02/14 职场文书
财务总监岗位职责
2014/03/07 职场文书
企业授权委托书范本
2014/04/02 职场文书
工商行政处罚决定书
2015/06/24 职场文书
JS异步堆栈追踪之为什么await胜过Promise
2021/04/28 Javascript
Vue实现下拉加载更多
2021/05/09 Vue.js