super
是 Python 中一个内置的函数,用于调用父类的方法或初始化父类的构造函数。它在类的继承关系中非常有用,尤其在多继承中,可以有效避免直接引用父类导致的复杂性和错误。
基本语法
super([type[, object-or-type]])
- type: 当前类(可选)。通常在类方法中省略,默认指调用
super()
的类。 - object-or-type: 当前类的实例(可选)。通常在类方法中省略,默认使用
self
。
常见用法
1. 调用父类的构造函数
class Parent:
def __init__(self, name):
self.name = name
print(f"Parent initialized with name: {self.name}")
class Child(Parent):
def __init__(self, name, age):
# 调用父类构造函数
super().__init__(name)
self.age = age
print(f"Child initialized with age: {self.age}")
child = Child("Alice", 10)
输出:
Parent initialized with name: Alice
Child initialized with age: 10
2. 调用父类的普通方法
class Parent:
def greet(self):
print("Hello from Parent")
class Child(Parent):
def greet(self):
# 调用父类方法
super().greet()
print("Hello from Child")
child = Child()
child.greet()
输出:
Hello from Parent
Hello from Child
3. 在多继承中使用 super
super
遵循 方法解析顺序 (MRO),按照继承关系自动寻找方法调用的顺序,避免重复调用。
class A:
def process(self):
print("A process")
class B(A):
def process(self):
print("B process")
super().process()
class C(A):
def process(self):
print("C process")
super().process()
class D(B, C):
def process(self):
print("D process")
super().process()
d = D()
d.process()
输出:
D process
B process
C process
A process
特点与规则
- 避免硬编码类名
使用super()
的方式更灵活,可自动适配继承链,不需直接调用父类名(例如Parent.method(self)
),减少代码耦合。 - 遵循 MRO (Method Resolution Order)
在多继承中,super
遵循MRO
,确保每个父类的方法只调用一次。 - 多继承时避免菱形继承问题
super
可以正确处理菱形继承结构,避免重复调用。
特殊场景
在类方法中使用
class Parent:
@classmethod
def greet(cls):
print(f"Hello from {cls.__name__}")
class Child(Parent):
@classmethod
def greet(cls):
super().greet()
print(f"Hello from {cls.__name__}")
Child.greet()
输出:
Hello from Parent
Hello from Child
在静态方法中无法使用 super
静态方法没有绑定实例或类,无法通过 super
调用父类方法。
class Parent:
@staticmethod
def greet():
print("Hello from Parent")
class Child(Parent):
@staticmethod
def greet():
# super().greet() # 无法使用,会报错
Parent.greet() # 静态方法需要直接调用
print("Hello from Child")
Child.greet()
总结
super
用于调用父类的构造函数或其他方法。- 在单继承中,
super()
让代码更灵活,避免直接引用父类名。 - 在多继承中,
super()
遵循 MRO,避免重复调用父类方法。 - 常用场景:
- 初始化父类构造函数。
- 调用父类中被重写的方法。
- 多继承时确保方法按正确顺序调用。