本系列将会陆续整理分享一些的Python内置函数。
-
通过百度网盘获取:
链接:https://pan.baidu.com/s/11x9_wCZ3yiYOe5nVcRk2CQ?pwd=mnsj
提取码:mnsj
-
前往GitHub获取:
https://github.com/returu/Python_built-in_functions
-
不带参数:
super()
-
带参数:
super(type, object_or_type=None)
-
type:想要访问其父类的类; -
object_or_type:提供方法解析上下文的实例或类。
下面是一些使用 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


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