在 Python 中,super
用于在子类中调用父类的方法。以下是一些关于 super
需要注意的知识点:
-
语法:
super()
或super(子类名, self)
(在 Python 3 中,super()
就足够了)。 -
调用顺序:
super
按照方法解析顺序(Method Resolution Order,MRO)来查找父类中的方法。MRO 决定了在多继承情况下方法的查找顺序。 -
初始化父类:在子类的
__init__
方法中,通常使用super
来调用父类的初始化方法,以确保父类的属性和设置正确初始化。 -
方法覆盖:当子类覆盖了父类的方法时,可以使用
super
来调用父类被覆盖的方法,以扩展或补充其功能。 -
多重继承:在多重继承的场景中,
super
的行为可能会变得复杂,需要特别小心 MRO 的影响,以避免意外的结果。class Parent: def __init__(self): self.parent_attribute = "Parent Attribute" class Child(Parent): def __init__(self): super().__init__() # 调用父类的初始化方法 self.child_attribute = "Child Attribute"
在上述示例中,通过
super().__init__()
确保了父类的初始化操作得以执行。再比如,如果父类和子类都有一个同名方法,在子类方法中可以这样:
class Parent: def method(self): print("Parent method") class Child(Parent): def method(self): super().method() # 先调用父类的方法 print("Child method")
这样,在调用子类的
method
方法时,会先执行父类的method
方法,然后再执行子类中的后续代码。
再例如
class A:
def __init__(self):
print("A")
class B(A):
def __init__(self):
print("B")
if __name__ == "__main__":
b = B()
这段代码定义了两个类 A
和 B
,其中 B
继承自 A
。
在 A
类中,__init__
方法会打印出 "A"
。
在 B
类中,__init__
方法只打印出 "B"
。
在 if __name__ == "__main__":
这部分代码中,创建了 B
类的一个实例 b
。当创建 b
时,会执行 B
类的 __init__
方法,所以会输出 "B"
。但由于 B
类的 __init__
方法没有调用父类 A
的 __init__
方法,所以不会输出 "A"
。
class A:
def __init__(self):
print("A")
class B(A):
def __init__(self):
print("B")
super().__init__() # 新增这行代码
if __name__ == "__main__":
b = B()
当添加了 super().__init__()
这行代码后,在创建 B
类的实例 b
时,首先会打印 "B"
,然后会调用父类 A
的 __init__
方法,打印出 "A"
。这样就实现了在子类的初始化方法中同时执行父类的初始化操作。
super继承搜索顺序,仍然遵从MRO规则。