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中dictionary items()系列函数的用法实例
Aug 21 Python
Python函数式编程指南(一):函数式编程概述
Jun 24 Python
用python实现刷点击率的示例代码
Feb 21 Python
python的命名规则知识点总结
Oct 04 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
Dec 31 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
Mar 04 Python
Python基于类路径字符串获取静态属性
Mar 12 Python
django 实现简单的插入视频
Apr 07 Python
Django 实现 Websocket 广播、点对点发送消息的代码
Jun 03 Python
python小白学习包管理器pip安装
Jun 09 Python
Pytorch之Tensor和Numpy之间的转换的实现方法
Sep 03 Python
pycharm远程连接服务器并配置python interpreter的方法
Dec 23 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
谈一谈收音机的高放电路
2021/03/02 无线电
php短域名转换为实际域名函数
2011/01/17 PHP
php获取本地图片文件并生成xml文件输出具体思路
2013/04/27 PHP
php实现文件下载代码分享
2014/08/19 PHP
jquery判断字符输入个数(数字英文长度记为1,中文记为2,超过长度自动截取)
2010/10/15 Javascript
JavaScript 验证码的实例代码(附效果图)
2013/03/22 Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
2013/04/26 Javascript
node.js中的fs.rename方法使用说明
2014/12/16 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
js验证框架之RealyEasy验证详解
2016/06/08 Javascript
Web打印解决方案之证件套打的实现思路
2016/08/29 Javascript
BooStrap对导航条的改造实践小结
2016/09/21 Javascript
深入理解JavaScript中的尾调用(Tail Call)
2017/02/07 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
2017/02/20 Javascript
详解利用jsx写vue组件的方法示例
2017/07/17 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
教你搭建按需加载的Vue组件库(小结)
2019/07/29 Javascript
vue+render+jsx实现可编辑动态多级表头table的实例代码
2020/04/01 Javascript
原生js生成图片验证码
2020/10/11 Javascript
简单介绍Python中的JSON模块
2015/04/08 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
2017/11/30 Python
python操作excel的包(openpyxl、xlsxwriter)
2018/06/11 Python
在python中利用opencv简单做图片比对的方法
2019/01/24 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
tensorflow 获取所有variable或tensor的name示例
2020/01/04 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
CSS3中使用RGBA设置透明度的示例
2015/08/04 HTML / CSS
腾讯公司的一个sql题
2013/01/22 面试题
医院护士求职自荐信格式
2013/09/21 职场文书
《长城》教学反思
2014/02/14 职场文书
大学迎新晚会主持词
2014/03/24 职场文书
药剂专业个人求职信范文
2014/04/29 职场文书
师德承诺书2015
2015/04/28 职场文书
电子表的操作介绍说明书
2019/10/28 职场文书
基于Python实现的购物商城管理系统
2021/04/27 Python
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL