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使用scrapy采集时伪装成HTTP/1.1的方法
Apr 08 Python
详解tensorflow载入数据的三种方式
Apr 24 Python
python 基本数据类型占用内存空间大小的实例
Jun 12 Python
Python判断中文字符串是否相等的实例
Jul 06 Python
pygame游戏之旅 添加游戏界面按键图形
Nov 20 Python
python requests.post带head和body的实例
Jan 02 Python
Python测试模块doctest使用解析
Aug 10 Python
Python实现生成密码字典的方法示例
Sep 02 Python
django创建超级用户过程解析
Sep 18 Python
简单了解python中的f.b.u.r函数
Nov 02 Python
python中有关时间日期格式转换问题
Dec 25 Python
Python读取Excel数据并生成图表过程解析
Jun 18 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 上传文件大小限制
2009/07/05 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
2016/11/20 PHP
PHP进程通信基础之信号量与共享内存通信
2017/02/19 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
jquery 与NVelocity 产生冲突的解决方法
2011/06/13 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
JavaScript获取路径设计源码
2014/05/22 Javascript
jQuery实现在列表的首行添加数据
2015/05/19 Javascript
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
EasyUI创建对话框的两种方式
2016/08/23 Javascript
微信小程序 HTTPS报错整理常见问题及解决方案
2016/12/14 Javascript
微信小程序Getuserinfo解决方案图解
2018/08/24 Javascript
JS隐藏号码中间4位代码实例
2019/04/09 Javascript
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
2019/10/24 Javascript
vue从后台渲染文章列表以及根据id跳转文章详情详解
2020/12/14 Vue.js
[03:22]DSPL第一期精彩集锦:酷炫到底!
2014/11/07 DOTA
各个系统下的Python解释器相关安装方法
2015/10/12 Python
将Emacs打造成强大的Python代码编辑工具
2015/11/20 Python
python使用psutil模块获取系统状态
2016/08/27 Python
利用python爬取斗鱼app中照片方法实例
2017/12/03 Python
zookeeper python接口实例详解
2018/01/18 Python
django 删除数据库表后重新同步的方法
2018/05/27 Python
对Python subprocess.Popen子进程管道阻塞详解
2018/10/29 Python
python 列表推导式使用详解
2019/08/29 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
2019/10/24 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
没编程基础可以学python吗
2020/06/17 Python
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
php优化查询foreach代码实例讲解
2021/03/24 PHP
2014年小学元旦活动方案
2014/02/12 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
2021/05/29 MySQL
Python中 range | np.arange | np.linspace三者的区别
2022/03/22 Python
经典《舰娘》游改全新动画预告 预定11月开播
2022/04/01 日漫
在容器中使用nginx搭建上传下载服务器
2022/05/11 Servers