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执行等待程序直到第二天零点的方法
Apr 23 Python
Python封装shell命令实例分析
May 05 Python
Python读取Excel的方法实例分析
Jul 11 Python
python3 requests中使用ip代理池随机生成ip的实例
May 07 Python
对命令行模式与python交互模式介绍
May 12 Python
对Python3之方法的覆盖与super函数详解
Jun 26 Python
TensorFlow2.0矩阵与向量的加减乘实例
Feb 07 Python
python3检查字典传入函数键是否齐全的实例
Jun 05 Python
python实现图书馆抢座(自动预约)功能的示例代码
Sep 29 Python
Python 图片处理库exifread详解
Feb 25 Python
Django给表单添加honeypot验证增加安全性
May 06 Python
PyQt5实现多张图片显示并滚动
Jun 11 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
在PHP语言中使用JSON和将json还原成数组的方法
2016/07/19 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
PHP使用观察者模式处理异常信息的方法详解
2019/09/24 PHP
js 解决“options为空或不是对象”
2008/12/22 Javascript
javascript eval函数深入认识
2009/02/21 Javascript
JS array 数组详解
2009/03/22 Javascript
JQuery扩展插件Validate—6 radio、checkbox、select的验证
2011/09/05 Javascript
推荐17个优美新鲜的jQuery的工具提示插件
2012/09/14 Javascript
jquery时间下拉框小例子
2013/04/15 Javascript
jQuery获取Radio,CheckBox选择的Value值(示例代码)
2013/12/12 Javascript
JavaScript取得键盘按下方向键是哪个的方法
2015/08/04 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
2016/01/23 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
2016/11/21 Javascript
详解vue2.0组件通信各种情况总结与实例分析
2017/03/22 Javascript
js实现分页功能
2017/05/24 Javascript
vue2.0 + element UI 中 el-table 数据导出Excel的方法
2018/03/02 Javascript
vue中子组件调用兄弟组件方法
2018/07/06 Javascript
Vue循环组件加validate多表单验证的实例
2018/09/18 Javascript
小程序实现上下移动切换位置
2019/09/23 Javascript
微信小程序中网络请求缓存的解决方法
2019/12/29 Javascript
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
python和pyqt实现360的CLable控件
2014/02/21 Python
Python中replace方法实例分析
2014/08/20 Python
详解Python中的静态方法与类成员方法
2017/02/28 Python
Python使用folium excel绘制point
2019/01/03 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
2019/04/16 Python
PYTHON EVAL的用法及注意事项解析
2019/09/06 Python
python空元组在all中返回结果详解
2020/12/15 Python
意大利男装网店:Vrients
2019/05/02 全球购物
应届大学生求职的自我评价
2013/11/17 职场文书
个人现实表现材料
2014/02/04 职场文书
维修工先进事迹
2014/05/29 职场文书
少先队活动总结
2014/08/29 职场文书
优秀共产党员主要事迹材料
2015/11/05 职场文书
详细聊聊vue中组件的props属性
2021/11/02 Vue.js
SQL CASE 表达式的具体使用
2022/03/21 SQL Server