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实现从ftp服务器下载文件的方法
Apr 30 Python
Python判断值是否在list或set中的性能对比分析
Apr 16 Python
Python 新建文件夹与复制文件夹内所有内容的方法
Oct 27 Python
django配置连接数据库及原生sql语句的使用方法
Mar 03 Python
django-rest-swagger的优化使用方法
Aug 29 Python
python编写猜数字小游戏
Oct 06 Python
详解Python绘图Turtle库
Oct 12 Python
Python Pickle 实现在同一个文件中序列化多个对象
Dec 30 Python
Transpose 数组行列转置的限制方式
Feb 11 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
May 20 Python
python使用opencv resize图像不进行插值的操作
Jul 05 Python
python实现学生信息管理系统(面向对象)
Jun 05 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
初探PHP5
2006/10/09 PHP
利用Laravel生成Gravatar头像地址的优雅方法
2017/12/30 PHP
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
原生JavaScript编写俄罗斯方块
2015/03/30 Javascript
javascript伸缩菜单栏实现代码分享
2015/11/12 Javascript
简单的jQuery banner图片轮播实例代码
2016/03/04 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
设计模式中的组合模式在JavaScript程序构建中的使用
2016/05/18 Javascript
jQuery实现查找链接文字替换属性的方法
2016/06/27 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
AngularJs Dependency Injection(DI,依赖注入)
2016/09/02 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
Vue学习之路之登录注册实例代码
2017/07/06 Javascript
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
2018/09/04 Javascript
使用Vue开发自己的Chrome扩展程序过程详解
2019/06/21 Javascript
茶余饭后聊聊Vue3.0响应式数据那些事儿
2019/10/30 Javascript
JS几个常用的函数和对象定义与用法示例
2020/01/15 Javascript
Python可变参数用法实例分析
2017/04/02 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
2017/10/11 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
numpy中的delete删除数组整行和整列的实例
2018/05/09 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
python dataframe向下向上填充,fillna和ffill的方法
2018/11/28 Python
django2.0扩展用户字段示例
2019/02/13 Python
python scrapy重复执行实现代码详解
2019/12/28 Python
Python多线程:主线程等待所有子线程结束代码
2020/04/25 Python
CSS3用@font-face实现自定义英文字体
2013/09/23 HTML / CSS
HTML5仿微信聊天界面、微信朋友圈实例代码
2018/01/29 HTML / CSS
Canvas制作的下雨动画的示例
2018/03/06 HTML / CSS
HTML5 直播疯狂点赞动画实现代码 附源码
2020/04/14 HTML / CSS
幼儿园消防安全制度
2014/01/26 职场文书
2014年公司植树节活动方案
2014/03/04 职场文书
马智宇结婚主持词
2014/04/01 职场文书
辞职信怎么写
2015/02/27 职场文书
中国合伙人观后感
2015/06/02 职场文书
MYSQL 的10大经典优化案例场景实战
2021/09/14 MySQL