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 __setattr__、 __getattr__、 __delattr__、__call__用法示例
Mar 06 Python
在 Python 应用中使用 MongoDB的方法
Jan 05 Python
Django ORM框架的定时任务如何使用详解
Oct 19 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
Jul 11 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
May 15 Python
python文件读写代码实例
Oct 21 Python
Python 安装 virturalenv 虚拟环境的教程详解
Feb 21 Python
Tkinter中复选菜单是否被选中的判断与设置方式
Mar 04 Python
python导入库的具体方法
Jun 18 Python
pycharm 实现复制一行的快捷键
Jan 15 Python
一篇文章带你了解Python和Java的正则表达式对比
Sep 15 Python
Golang Web 框架Iris安装部署
Aug 14 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制作静态网站的模板框架(三)
2006/10/09 PHP
dedecms模板标签代码官方参考
2007/03/17 PHP
php实现微信公众号无限群发
2015/10/11 PHP
javascript在事件监听方面的兼容性小结
2010/04/07 Javascript
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
浅谈Javascript嵌套函数及闭包
2010/11/09 Javascript
一个关于javascript匿名函数的问题分析
2012/03/30 Javascript
JS执行删除前的判断代码
2014/02/18 Javascript
node.js中的console.time方法使用说明
2014/12/09 Javascript
Jquery代码实现图片轮播效果(一)
2015/08/12 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
2015/11/17 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
2016/01/29 Javascript
jQuery获取多种input值的简单实现方法
2016/06/20 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
BootStrap Validator使用注意事项(必看篇)
2016/09/28 Javascript
Vue插件写、用详解(附demo)
2017/03/20 Javascript
vue的事件绑定与方法详解
2017/08/16 Javascript
详解layui弹窗父子窗口之间传参数的方法
2018/01/16 Javascript
Vue瀑布流插件的使用示例
2018/09/19 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
2018/12/05 Javascript
Django框架中render_to_response()函数的使用方法
2015/07/16 Python
用Python抢火车票的简单小程序实现解析
2019/08/14 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
2020/02/17 Python
Python TKinter如何自动关闭主窗口
2020/02/26 Python
python新式类和经典类的区别实例分析
2020/03/23 Python
CSS3实战第一波 让我们尽情的圆角吧
2010/08/27 HTML / CSS
凯撒娱乐:Caesars Entertainment
2018/02/23 全球购物
自我鉴定书面格式
2014/01/13 职场文书
党员活动日总结
2014/05/05 职场文书
刑事辩护授权委托书范本
2014/10/17 职场文书
2014年企业党支部工作总结
2014/12/04 职场文书
乌镇导游词
2015/02/02 职场文书
社区六一儿童节活动总结
2015/02/11 职场文书
档案工作个人总结
2015/03/03 职场文书
表扬信格式模板
2015/05/05 职场文书
教你怎么用Python实现GIF动图的提取及合成
2021/06/15 Python