python中super()的作用是什么

发布时间:2020-08-13 13:59:16

来源:亿速云

阅读:112

作者:小新

这篇文章主要介绍python中super()的作用是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

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()的作用是什么的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

super在python中是什么意思_python中super()的作用是什么相关推荐

  1. python中superclass是什么_Python中super()函数简介及用法分享

    首先看一下super()函数的定义: super([type [,object-or-type]]) Return a **proxy object** that delegates method c ...

  2. python中的元类_Python中的元类(metaclass)

    提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自身有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理 ...

  3. python新式类c3算法_python中的MRO和C3算法

    一. 经典类和新式类 1.python多继承 在继承关系中,python子类自动用友父类中除了私有属性外的其他所有内容.python支持多继承.一个类可以拥有多个父类 2.python2和python ...

  4. python中函数的作用域_Python中的函数作用域

    在python中,一个函数就是一个作用域 name = 'xiaoyafei' def change_name(): name = '肖亚飞' print('在change_name里的name:', ...

  5. python列表怎么写文件_python中以字典为元素的列表怎么写入文本文件

    python如何将列表中的元素添加进字典纵然被命运的铁蹄狠狠践踏,也顽强地长出自己的根芽. 录入自己和另一个人的名字的汉语拼音简写,然后依据标识符中字母的数值两个人,一颗心,依偎的不是爱情而是那小温暖 ...

  6. python飞机大战简书_python中的小游戏——飞机大战

    精灵类---plane_sprites #这个模块放一些常用的工具和基础类和精灵类 #在其他模块调用 import pygame import random #设置游戏屏幕大小 这是一个常量 SCRE ...

  7. python中round函数参数_python中关于round函数的小坑

    round函数很简单,对浮点数进行近似取值,保留几位小数.比如 >>> round(10.0/3, 2) 3.33 >>> round(20/7) 3 第一个参数是 ...

  8. python里的join方法_python中join()方法介绍

    描述 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. 语法 join()方法语法: str . join ( sequence ) 参数 sequence -- ...

  9. python常用函数的用法_python中常用函数整理

    1.map map是python内置的高阶函数,它接收一个函数和一个列表,函数依次作用在列表的每个元素上,返回一个可迭代map对象. class map(object):""&qu ...

  10. python中反斜杠_Python中的正斜杠/与反斜杠\

    知识点: 1. "/"左倾斜是正斜杠,"\"右倾斜是反斜杠,可以记为:除号是正斜杠 2. 对于目录分隔符,Unix和Web用正斜杠/,Windows用反斜杠\. ...

最新文章

  1. python3.7.2怎么用不了pillow_python 3.7.0 下pillow安装方法
  2. OSI第四层:传输层功能及作用
  3. C#中成员初始化顺序
  4. 每日程序C语言31-auto的使用
  5. mysql 数值型注入_SQL注入之PHP-MySQL实现手工注入-数字型
  6. linux epoll 开发指南-【ffrpc源码解析】
  7. C#中MSMQ消息队列测试疑问
  8. 70. 命名空间 与 自动加载
  9. Docker 容器使用教程
  10. 【Oracle教程资源大合集】Oracle数据库免费学习资源汇总
  11. Flex builder3 调试弹出窗口Flex builder cannot locate the required version of Flash Player解决办法
  12. 双容水箱液位串级控制系统的设计
  13. 智课雅思词汇---二十四、名词性后缀ary(也是形容词后缀)
  14. day 0150面向对象-成员
  15. MATLAB 整数小数负数十进制转换为十六进制
  16. itext实现横向pdf打印
  17. 别再说自己不会了!2021年教你增加拿到BAT等大厂offer几率,醍醐灌顶!
  18. 【附白皮书下载】制造业数字化转型专家黄正杰:设备健康如何管理?
  19. IDEA代码提示快捷键Ctrl+Space不生效问题
  20. Tex插入各种希腊字母

热门文章

  1. strchr()函数与strrchr()函数的实现
  2. Angular /Angular cli安装教程
  3. Salesforce Apex 中常用技能总结(持续更新)
  4. Python中的列表遍历
  5. Linux下配置Samba服务器使用SMBv1或SMBv2协议
  6. 《深度学习》学习笔记(一)
  7. groupadd: cannot open /etc/group
  8. 养成好习惯,戒掉坏习惯
  9. 基于GeoServer的电子地图系统说明
  10. 户外露营冷藏箱的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告