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数据挖掘 Json结构分析
Apr 21 Python
在cmder下安装ipython以及环境的搭建
Oct 19 Python
Python编程flask使用页面模版的方法
Dec 28 Python
python 爬取学信网登录页面的例子
Aug 13 Python
Python 多线程其他属性以及继承Thread类详解
Aug 28 Python
python实现名片管理器的示例代码
Dec 17 Python
快速查找Python安装路径方法
Feb 06 Python
django rest framework serializer返回时间自动格式化方法
Mar 31 Python
python脚本定时发送邮件
Dec 22 Python
一篇文章带你搞懂Python类的相关知识
May 20 Python
Python自动化之批量处理工作簿和工作表
Jun 03 Python
python开发飞机大战游戏
Jul 15 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
资料注册后发信小技巧
2006/10/09 PHP
使一个函数作为另外一个函数的参数来运行的javascript代码
2007/08/13 Javascript
javascript 学习之旅 (1)
2009/02/05 Javascript
关于JavaScript定义类和对象的几种方式
2010/11/09 Javascript
javascript中定义私有方法说明(private method)
2014/01/27 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
2015/11/23 Javascript
Bootstrap 轮播(Carousel)插件
2016/12/26 Javascript
vue.js利用defineProperty实现数据的双向绑定
2017/04/28 Javascript
JavaScript框架Angular和React深度对比
2017/11/20 Javascript
基于vue2实现左滑删除功能
2017/11/28 Javascript
ES6 Symbol数据类型的应用实例分析
2019/06/26 Javascript
基于JavaScript获取base64图片大小
2019/10/18 Javascript
js中forEach,for in,for of循环的用法示例小结
2020/03/14 Javascript
Vue之封装公用变量以及实现方式
2020/07/31 Javascript
vue data变量相互赋值后被实时同步的解决步骤
2020/08/05 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
2020/10/22 Javascript
js仿淘宝放大镜效果
2020/12/28 Javascript
JavaScript代码实现微博批量取消关注功能
2021/02/05 Javascript
[01:51]DAC趣味视频-如何成为职业选手.mp4
2017/04/02 DOTA
基于python(urlparse)模板的使用方法总结
2017/10/13 Python
Python下应用opencv 实现人脸检测功能
2019/10/24 Python
python元组的概念知识点
2019/11/19 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
2020/07/13 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
Sperry官网:帆船鞋创始品牌
2016/09/07 全球购物
卫生巾广告词
2014/03/18 职场文书
外语专业毕业生自荐信
2014/04/14 职场文书
物业管理委托协议(2篇)
2014/09/23 职场文书
2015学校师德师风工作总结
2015/04/22 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
养成教育工作总结
2015/08/13 职场文书
初任公务员培训心得体会
2016/01/08 职场文书
如何书写你的职业生涯规划书?
2019/06/27 职场文书
Python3 使用pip安装git并获取Yahoo金融数据的操作
2021/04/08 Python