详解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 匹配任意字符(包括换行符)的正则表达式写法
Oct 29 Python
学习Python3 Dlib19.7进行人脸面部识别
Jan 24 Python
python利用smtplib实现QQ邮箱发送邮件
May 20 Python
python中for循环输出列表索引与对应的值方法
Nov 07 Python
解决python给列表里添加字典时被最后一个覆盖的问题
Jan 21 Python
使用 python pyautogui实现鼠标键盘控制功能
Aug 04 Python
Python 如何优雅的将数字转化为时间格式的方法
Sep 26 Python
python使用正则来处理各种匹配问题
Dec 22 Python
python实现逆滤波与维纳滤波示例
Feb 26 Python
python读取yaml文件后修改写入本地实例
Apr 27 Python
python是怎么被发明的
Jun 15 Python
Django haystack实现全文搜索代码示例
Nov 28 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
动漫女神老婆无限好,但日本女生可能就不是这么一回事了!
2020/03/04 日漫
php5 图片验证码实现代码
2009/12/11 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
2017/06/17 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
2010/02/26 Javascript
Chosen 基于jquery的选择框插件使用方法
2012/05/30 Javascript
js实现checkbox全选和反选示例
2014/05/01 Javascript
JS实现输入框提示文字点击时消失效果
2016/07/19 Javascript
基于angular中的重要指令详解($eval,$parse和$compile)
2016/10/21 Javascript
详解vue mint-ui源码解析之loadmore组件
2017/10/11 Javascript
解决bootstrap模态框数据缓存的问题方法
2018/08/10 Javascript
JS实现分页导航效果
2020/02/19 Javascript
VSCode插件安装完成后的配置(常用配置)
2020/08/24 Javascript
Python Web框架Pylons中使用MongoDB的例子
2013/12/03 Python
在IIS服务器上以CGI方式运行Python脚本的教程
2015/04/25 Python
python避免死锁方法实例分析
2015/06/04 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
关于python下cv.waitKey无响应的原因及解决方法
2019/01/10 Python
浅谈Python中函数的定义及其调用方法
2019/07/19 Python
余弦相似性计算及python代码实现过程解析
2019/09/18 Python
Python实现进度条和时间预估的示例代码
2020/06/02 Python
用Python爬取LOL所有的英雄信息以及英雄皮肤的示例代码
2020/07/13 Python
Python中过滤字符串列表的方法
2020/12/22 Python
定制别致的瑜伽垫:Sugarmat
2019/06/21 全球购物
IGK Hair官网:喷雾、洗发水、护发素等
2020/11/03 全球购物
电子商务个人职业生涯规划范文
2014/02/12 职场文书
文秘大学生求职信
2014/02/25 职场文书
给老婆的保证书范文
2014/04/28 职场文书
村干部培训方案
2014/05/02 职场文书
市场营销策划方案
2014/06/11 职场文书
伏羲庙导游词
2015/02/09 职场文书
2015年卫生局工作总结
2015/07/24 职场文书
赞助商致辞
2015/07/30 职场文书
2016年母亲节寄语
2015/12/04 职场文书
Python中使用Lambda函数的5种用法
2021/04/01 Python
Python编程中内置的NotImplemented类型的用法
2022/03/23 Python