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实现的异步代理爬虫及代理池
Mar 17 Python
Python中使用Counter进行字典创建以及key数量统计的方法
Jul 06 Python
python用BeautifulSoup库简单爬虫实例分析
Jul 30 Python
解决每次打开pycharm直接进入项目的问题
Oct 28 Python
解决Pycharm下面出现No R interpreter defined的问题
Oct 29 Python
python 删除字符串中连续多个空格并保留一个的方法
Dec 22 Python
Python网络爬虫之爬取微博热搜
Apr 18 Python
Apache,wsgi,django 程序部署配置方法详解
Jul 01 Python
关于django 1.10 CSRF验证失败的解决方法
Aug 31 Python
python multiprocessing多进程变量共享与加锁的实现
Oct 02 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
Jul 15 Python
python pyhs2 的安装操作
Apr 07 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
php array_intersect()函数使用代码
2009/01/14 PHP
使用PHP 5.0创建图形的巧妙方法
2010/10/12 PHP
javascript事件模型代码
2007/07/01 Javascript
用javascript实现点击链接弹出&quot;图片另存为&quot;而不是直接打开
2007/08/15 Javascript
js兼容标准的表格变色效果
2008/06/28 Javascript
javascript写的简单的计算器,内容很多,方法实用,推荐
2011/12/29 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
2013/09/30 Javascript
Js实现动态添加删除Table行示例
2014/04/14 Javascript
关于JavaScript命名空间的一些心得
2014/06/07 Javascript
Javascript连接Access数据库完整实例
2015/08/03 Javascript
jquery彩色投票进度条简单实例演示
2020/07/23 Javascript
js去字符串前后空格的实现方法
2016/02/26 Javascript
JS简单实现浮动窗口效果示例
2016/09/07 Javascript
JavaScript队列、优先队列与循环队列
2016/11/14 Javascript
React简单介绍
2017/05/24 Javascript
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
写一个Vue Popup组件
2019/02/25 Javascript
layui动态表头的实现代码
2019/08/22 Javascript
Vue的全局过滤器和私有过滤器的实现
2020/04/20 Javascript
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
详解python之配置日志的几种方式
2017/05/22 Python
python笔记:mysql、redis操作方法
2017/06/28 Python
详解python3中的真值测试
2018/08/13 Python
Tensorflow模型实现预测或识别单张图片
2019/07/19 Python
Python实现滑动平均(Moving Average)的例子
2019/08/24 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
2020/05/26 Python
解决导入django_filters不成功问题No module named 'django_filter'
2020/07/15 Python
Python调用Redis的示例代码
2020/11/24 Python
Python APScheduler执行使用方法详解
2020/12/10 Python
以实惠的价格提供高品质的时尚:Newchic
2018/01/18 全球购物
写出程序把一个链表中的接点顺序倒排
2014/04/28 面试题
Lucene推荐的分页方式是什么?
2015/12/07 面试题
办理居住证介绍信
2014/01/15 职场文书
流动人口婚育证明
2014/10/19 职场文书
2014年统战工作总结
2014/12/09 职场文书