详解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判断操作系统类型代码分享
Nov 22 Python
Python生成随机密码
Mar 10 Python
Python中列表和元组的相关语句和方法讲解
Aug 20 Python
深入讲解Python编程中的字符串
Oct 14 Python
Python基于列表模拟堆栈和队列功能示例
Jan 05 Python
Python进阶之@property动态属性的实现
Apr 01 Python
python实现Excel文件转换为TXT文件
Apr 28 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
Mar 23 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
Jul 01 Python
Python confluent kafka客户端配置kerberos认证流程详解
Oct 12 Python
python 基于opencv去除图片阴影
Jan 26 Python
Python 发送SMTP邮件的简单教程
Jun 24 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下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
2010/12/29 PHP
PHP操作MySQL事务实例
2014/11/05 PHP
php查找字符串出现次数的方法
2014/12/01 PHP
PHP Header用于页面跳转时的几个注意事项
2016/10/21 PHP
js判断横竖屏及禁止浏览器滑动条示例
2014/04/29 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
js实现网页图片延时加载 提升网页打开速度
2016/01/26 Javascript
灵活的理解JavaScript中的this指向
2016/02/25 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
工作中常用的js、jquery自定义扩展函数代码片段汇总
2016/12/22 Javascript
angularjs使用directive实现分页组件的示例
2017/02/07 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
2017/05/13 jQuery
vue2.0与bootstrap3实现列表分页效果
2017/11/28 Javascript
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
vuejs2.0运用原生js实现简单拖拽元素功能
2020/08/21 Javascript
JS实现获取当前所在周的周六、周日示例分析
2019/05/11 Javascript
mpvue小程序循环动画开启暂停的实现方法
2019/05/15 Javascript
nodeJs的安装与npm全局环境变量的配置详解
2020/01/06 NodeJs
JavaScript实现猜数字游戏
2020/05/20 Javascript
[48:54]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第二场 6.3
2018/06/04 DOTA
python列表生成式与列表生成器的使用
2018/02/23 Python
python实现简单登陆流程的方法
2018/04/22 Python
pandas表连接 索引上的合并方法
2018/06/08 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
python3 pygame实现接小球游戏
2019/05/14 Python
Python 图像处理: 生成二维高斯分布蒙版的实例
2019/07/04 Python
Python绘图实现台风路径可视化代码实例
2020/10/23 Python
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
自我鉴定的范文
2013/10/03 职场文书
大学生职业生涯设计书
2014/01/02 职场文书
人事部经理岗位职责
2014/03/07 职场文书
房产协议书范本
2014/10/18 职场文书
民用住房租房协议书
2014/10/29 职场文书
2015年学校工作总结范文
2015/04/20 职场文书
Vue操作Storage本地化存储
2022/04/29 Vue.js
nginx 添加http_stub_status_module模块
2022/05/25 Servers