详解python的super()的作用和原理


Posted in Python onOctober 29, 2020

Python中对象方法的定义很怪异,第一个参数一般都命名为self(相当于其它语言的this),用于传递对象本身,而在调用的时候则不必显式传递,系统会自动传递。

今天我们介绍的主角是super(), 在类的继承里面super()非常常用, 它解决了子类调用父类方法的一些问题, 父类多次被调用时只执行一次, 优化了执行逻辑,下面我们就来详细看一下。

举一个例子:

class Foo:

  def bar(self, message):

    print(message)
>>> Foo().bar("Hello, Python.")

Hello, Python.

当存在继承关系的时候,有时候需要在子类中调用父类的方法,此时最简单的方法是把对象调用转换成类调用,需要注意的是这时self参数需要显式传递,例如:

class FooParent:

  def bar(self, message):

    print(message)

class FooChild(FooParent):

  def bar(self, message):

    FooParent.bar(self, message)
>>> FooChild().bar("Hello, Python.")

Hello, Python.

这样做有一些缺点,比如说如果修改了父类名称,那么在子类中会涉及多处修改,另外,Python是允许多继承的语言,如上所示的方法在多继承时就需要重复写多次,显得累赘。为了解决这些问题,Python引入了super()机制,例子代码如下:

class FooParent:

  def bar(self, message):

    print(message)

class FooChild(FooParent):

  def bar(self, message):

    super(FooChild, self).bar(message)
>>> FooChild().bar("Hello, Python.")

Hello, Python.

表面上看 super(FooChild, self).bar(message)方法和FooParent.bar(self, message)方法的结果是一致的,实际上这两种方法的内部处理机制大大不同,当涉及多继承情况时,就会表现出明显的差异来,直接给例子:

代码一

class A:

  def __init__(self):

    print("Enter A")

    print("Leave A")

class B(A):

  def __init__(self):

    print("Enter B")

    A.__init__(self)

    print("Leave B")

class C(A):

  def __init__(self):

    print("Enter C")

    A.__init__(self)

    print("Leave C")

class D(A):

  def __init__(self):

    print("Enter D")

    A.__init__(self)

    print("Leave D")

class E(B, C, D):

  def __init__(self):

    print("Enter E")

    B.__init__(self)

    C.__init__(self)

    D.__init__(self)

    print("Leave E")

E()

输出结果

Enter E

Enter B

Enter A

Leave A

Leave B

Enter C

Enter A

Leave A

Leave C

Enter D

Enter A

Leave A

Leave D

Leave E

执行顺序很好理解,唯一需要注意的是公共父类A被执行了多次。

代码二

class A:

  def __init__(self):

    print("Enter A")

    print("Leave A")

class B(A):

  def __init__(self):

    print("Enter B")

    super(B, self).__init__()

    print("Leave B")

class C(A):

  def __init__(self):

    print("Enter C")

    super(C, self).__init__()

    print("Leave C")

class D(A):

  def __init__(self):

    print("Enter D")

    super(D, self).__init__()

    print("Leave D")

class E(B, C, D):

  def __init__(self):

    print("Enter E")

    super(E, self).__init__()

    print("Leave E")

E()

输出结果

Enter E

Enter B

Enter C

Enter D

Enter A

Leave A

Leave D

Leave C

Leave B

Leave E

在super机制里可以保证公共父类仅被执行一次,至于执行的顺序,是按照MRO(Method Resolution Order):方法解析顺序 进行的。

以上就是详解python的super()的作用和原理的详细内容,更多关于python super()的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python 字符串操作实现代码(截取/替换/查找/分割)
Jun 08 Python
介绍Python的Django框架中的QuerySets
Apr 20 Python
在Django中管理Users和Permissions以及Groups的方法
Jul 23 Python
python3读取MySQL-Front的MYSQL密码
May 03 Python
linux环境下python中MySQLdb模块的安装方法
Jun 16 Python
Python中的defaultdict与__missing__()使用介绍
Feb 03 Python
Python3实现腾讯云OCR识别
Nov 27 Python
Python 2种方法求某个范围内的所有素数(质数)
Jan 31 Python
如何使用selenium和requests组合实现登录页面
Feb 03 Python
Python替换NumPy数组中大于某个值的所有元素实例
Jun 08 Python
python实现每天自动签到领积分的示例代码
Aug 18 Python
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
Oct 16 Python
Python生成pdf目录书签的实例方法
Oct 29 #Python
利用python清除移动硬盘中的临时文件
Oct 28 #Python
python实现一个简单RPC框架的示例
Oct 28 #Python
pycharm永久激活超详细教程
Oct 29 #Python
linux mint中搜狗输入法导致pycharm卡死的问题
Oct 28 #Python
浅谈Python __init__.py的作用
Oct 28 #Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
Oct 28 #Python
You might like
如何对PHP程序中的常见漏洞进行攻击(上)
2006/10/09 PHP
php递归列出所有文件和目录的代码
2008/09/10 PHP
php将日期格式转换成xx天前的格式
2015/04/16 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
Ubuntu上安装yaf扩展的方法
2018/01/29 PHP
PHP实现断点续传乱序合并文件的方法
2018/09/06 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
2018/10/12 PHP
防止jQuery ajax Load使用缓存的方法小结
2014/02/22 Javascript
Highcharts学习之坐标轴
2016/08/02 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
纯JS实现的读取excel文件内容功能示例【支持所有浏览器】
2018/06/23 Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
2018/12/25 Javascript
Angular(5.2->6.1)升级小结
2018/12/27 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
2019/09/23 Javascript
使用jQuery实现掷骰子游戏
2019/10/24 jQuery
详解Vue Cli浏览器兼容性实践
2020/06/08 Javascript
小程序实现录音功能
2020/09/22 Javascript
python基础教程之类class定义使用方法
2014/02/20 Python
Python列表生成器的循环技巧分享
2015/03/06 Python
Python中使用PyQt把网页转换成PDF操作代码实例
2015/04/23 Python
python生成器generator用法实例分析
2015/06/04 Python
Python tornado队列示例-一个并发web爬虫代码分享
2018/01/09 Python
python爬虫爬取某站上海租房图片
2018/02/04 Python
Python下载网络文本数据到本地内存的四种实现方法示例
2018/02/05 Python
Python设计模式之组合模式原理与用法实例分析
2019/01/11 Python
Python实现的远程文件自动打包并下载功能示例
2019/07/12 Python
Python基于Twilio及腾讯云实现国际国内短信接口
2020/06/18 Python
Tensorflow使用Anaconda、pycharm安装记录
2020/07/29 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
英国最大的在线时尚眼镜店:Eyewearbrands
2019/03/12 全球购物
黄金酒广告词
2014/03/21 职场文书
学习之星事迹材料
2014/05/17 职场文书
七一建党日演讲稿
2014/09/05 职场文书
2016医师资格考试考生诚信考试承诺书
2016/03/25 职场文书
简单聊聊Vue中的计算属性和属性侦听
2021/10/05 Vue.js