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 将字符串转换成字典dict
Mar 24 Python
Python程序设计入门(5)类的使用简介
Jun 16 Python
深入浅析python 中的匿名函数
May 21 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
Dec 15 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
Dec 24 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
Feb 16 Python
python之当你发现QTimer不能用时的解决方法
Jun 21 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
Mar 26 Python
Python3爬虫关于识别检验滑动验证码的实例
Jul 30 Python
Python 随机按键模拟2小时
Dec 30 Python
Python Pandas模块实现数据的统计分析的方法
Jun 24 Python
Python基本数据类型之字符串str
Jul 21 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扩展编写点滴 技巧收集
2010/03/09 PHP
php中定义网站根目录的常用方法
2010/08/08 PHP
在php中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
php字符集转换
2017/01/23 PHP
利用PHPExcel实现Excel文件的写入和读取
2017/04/26 PHP
PHP实现简单登录界面
2019/10/23 PHP
Thinkphp5框架中引入Markdown编辑器操作示例
2020/06/03 PHP
js静态作用域的功能。
2006/12/25 Javascript
Javascript中arguments对象详解
2014/10/22 Javascript
介绍JavaScript的一个微型模版
2015/06/24 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
2016/07/27 Javascript
JavaScript编码风格指南(中文版)
2016/08/26 Javascript
AngularJs Understanding the Controller Component
2016/09/02 Javascript
详解前端自动化工具gulp自动添加版本号
2016/12/20 Javascript
Javascript 两种刷新方法以及区别和适用范围
2017/01/17 Javascript
Node.js读取文件内容示例
2017/03/07 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
2017/04/13 Javascript
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
vue组件实现可搜索下拉框扩展
2020/10/23 Javascript
Vue实现table上下移动功能示例
2019/02/21 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
2019/05/22 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
2020/05/12 Javascript
ES6中的类(Class)示例详解
2020/12/09 Javascript
[06:23]2014DOTA2西雅图国际邀请赛 小组赛7月12日TOPPLAY
2014/07/12 DOTA
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
python区分不同数据类型的方法
2019/10/14 Python
浅谈Python中的模块
2020/06/10 Python
Python turtle库的画笔控制说明
2020/06/28 Python
Python类成员继承重写的实现
2020/09/16 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
2020/09/23 Python
给学校的建议书
2014/03/12 职场文书
母校寄语大全
2014/04/10 职场文书
行政专员求职信范文
2014/05/03 职场文书
2014年图书管理员工作总结
2014/12/01 职场文书
校园之声广播稿
2015/08/18 职场文书
spring项目中切面及AOP的使用方法
2021/06/26 Java/Android