首页Python【Python内置函数】s...

【Python内置函数】super()函数

Python 提供了许多内置函数,这些函数是Python语言的一部分,可以直接在Python程序中使用而无需导入任何模块。

本系列将会陆续整理分享一些的Python内置函数。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/11x9_wCZ3yiYOe5nVcRk2CQ?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_built-in_functions





01
简介

super()函数主要用于在类继承中调用父类或超类的方法。常用于继承关系中,允许子类调用父类的方法,而不需要显式指定父类的名称。super()的主要用途是在子类中扩展父类的功能,同时避免直接引用父类名称,使代码更具灵活性和可维护性。
super()返回一个代理对象,该对象会将方法调用委托给父类。它有以下两种常见的形式:
  • 不带参数:
super()
该方式只在类定义内部有效,它会自动推断出当前类和当前实例。
  • 带参数:
super(type, object_or_type=None)
该方式可以在类定义之外使用,需要显式指定子类和实例,适用于需要明确控制方法解析顺序的场景。
参数说明:
  • type:想要访问其父类的类;
  • object_or_type:提供方法解析上下文的实例或类。


02
使用:

下面是一些使用 super() 函数的示例:

  • 示例 1:单继承中使用

在单继承中,super()通常用于在不显式命名父类的情况下调用父类的方法。

super()通常用于子类的__init__方法中,以确保父类的初始化逻辑被执行。

class A:
    def __init__(self):
        print("A initialized")

class B(A):
    def __init__(self):
        print("B initialized")
        super().__init__()  # 调用父类的构造函数
        # 也可以使用双参数形式的 super() 调用父类的方法
        # super(B, self).__init__() # 显式指定子类和实例

# 测试代码
child = B()
# 输出:B initialized
#      A initialized


  • 示例 2:多继承中使用

在多继承中,super()的行为更加复杂,它会按照方法解析顺序(Method Resolution Order,MRO)来调用父类的方法。MRO是一个类的线性顺序列表,用于确定方法调用的顺序,确保每个类只被调用一次。

class A:
    def __init__(self):
        print("A initialized")

class B(A):
    def __init__(self):
        print("B initialized")
        super().__init__()  # 调用父类的构造函数
        # 也可以使用双参数形式的 super() 调用父类的方法
        # super(B, self).__init__()

class C(A):
    def __init__(self):
        print("C initialized")
        super().__init__()  # 调用父类的构造函数
        # 使用双参数形式的 super() 调用父类的方法
        # super(C, self).__init__()

class D(B, C):
    def __init__(self):
        print("D initialized")
        # super().__init__()
        # 使用双参数形式的 super() 调用父类的方法
        super(D, self).__init__()

obj = D()
# 输出:D initialized
#      B initialized
#      C initialized
#      A initialized


  • 示例 3:MRO 的理解

每个类都有一个__mro__属性,该属性列出了进行方法解析时使用的搜索顺序。这个属性是动态的,每当继承层次结构更新时,它都会改变。

可以通过类的.__mro__ 属性查看类的 MRO 顺序。

class A:
    def __init__(self):
        print("A initialized")

class B(A):
    def __init__(self):
        print("B initialized")
        super().__init__()

class C(A):
    def __init__(self):
        print("C initialized")
        super().__init__()

class D(B, C):
    def __init__(self):
        print("D initialized")
        super().__init__()

# 查看 MRO
print(D.__mro__)
# 输出:(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)


  • 示例 4:类方法中使用

双参数形式也可以用于类方法(@classmethod)。

另外,super()不仅限于在__init__方法中使用,它可以在任何需要调用父类方法的地方使用。

class Parent:
    @classmethod
    def greet(cls, name):
        print(f"Hello, {name}! I am the Parent class.")

class Child(Parent):
    @classmethod
    def greet(cls, name):
        super().greet(name)
        # 也可以使用双参数形式的 super() 调用父类的类方法
        # super(Child, cls).greet(name)  # 显式指定子类和类
        print(f"Hi, {name}! I am the Child class.")

# 测试代码
Child.greet("Alice")
# 输出:Hello, Alice! I am the Parent class.
#      Hi, Alice! I am the Child class.


  • 示例 5:在类外部使用

双参数形式可以在类外部使用,例如在普通函数中。

class A:
    def greet(self):
        print("Hello from A")

class B(A):
    def greet(self):
        print("Hello from B")

# 在类外部调用父类方法
def call_parent_greet(obj):
    super(B, obj).greet()  # 显式调用 B 的父类 A 的 greet 方法

# 创建 B 的实例
obj = B()
call_parent_greet(obj)
# 输出:Hello from A


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments