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入门基础之用户输入与模块初认识
Nov 14 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
Feb 13 Python
Python简单获取二维数组行列数的方法示例
Dec 21 Python
扩展Django admin的list_filter()可使用范围方法
Aug 21 Python
Python3操作Excel文件(读写)的简单实例
Sep 02 Python
python实现高斯(Gauss)迭代法的例子
Nov 20 Python
Python处理PDF与CDF实例
Feb 26 Python
python实现最速下降法
Mar 24 Python
Python lambda表达式原理及用法解析
Aug 18 Python
使用python-cv2实现视频的分解与合成的示例代码
Oct 26 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
Nov 06 Python
Python import模块的缓存问题解决方案
Jun 02 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
在IIS上安装PHP4.0正式版
2006/10/09 PHP
百度ping方法使用示例 自动ping百度
2014/01/26 PHP
php中 $$str 中 &quot;$$&quot; 的详解
2015/07/06 PHP
php+lottery.js实现九宫格抽奖功能
2019/07/21 PHP
在页面上点击任一链接时触发一个事件的代码
2007/04/07 Javascript
javascript实现 在光标处插入指定内容
2007/05/25 Javascript
关于Mozilla浏览器不支持innerText的解决办法
2011/01/01 Javascript
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
JS中处理与当前时间间隔的函数代码
2012/05/23 Javascript
javascript跑马灯悬停放大效果实现代码
2012/12/12 Javascript
轻松创建nodejs服务器(10):处理上传图片
2014/12/18 NodeJs
Jquery动态添加输入框的方法
2015/05/29 Javascript
AngularJS基础 ng-href 指令用法
2016/08/01 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
node.js Sequelize实现单实例字段或批量自增、自减
2016/12/08 Javascript
Node.js使用gm拼装sprite图片
2017/07/04 Javascript
js中json对象和字符串的理解及相互转化操作实现方法
2017/09/22 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
vue2.0 实现富文本编辑器功能
2019/05/26 Javascript
在react项目中使用antd的form组件,动态设置input框的值
2020/10/24 Javascript
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS TNC
2018/03/30 DOTA
Python入门篇之编程习惯与特点
2014/10/17 Python
python 利用文件锁单例执行脚本的方法
2019/02/19 Python
python文件操作的简单方法总结
2019/11/07 Python
python中的数组赋值与拷贝的区别详解
2019/11/26 Python
解决json中ensure_ascii=False的问题
2020/04/03 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
Windows下Sqlmap环境安装教程详解
2020/08/04 Python
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
台湾网友喜爱的综合型网路购物商城:Yahoo! 奇摩购物中心
2018/03/10 全球购物
营销人才自我鉴定范文
2013/12/25 职场文书
企业项目策划书
2014/01/11 职场文书
企业优秀员工事迹材料
2014/05/28 职场文书
家庭贫困证明范本(经典版)
2014/09/22 职场文书
英语教师个人总结
2015/02/09 职场文书
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
2021/05/27 Servers