2026-10-20 10:55:47
Python中super()函数用于在子类中调用父类的方法,尤其在重写方法时实现扩展而非完全重写,避免重复代码,并确保多继承场景下方法调用的正确性。
1. super()的核心作用在继承结构中,子类重写父类方法时,若需保留父类逻辑,可通过super()调用父类方法。例如:
class Base: def move(self): print("Base: Moving to (0,0)")class Sub(Base): def move(self): print("Sub: Recording offset") super().move() # 调用父类Base的move方法obj = Sub()obj.move()输出:
Sub: Recording offsetBase: Moving to (0,0)Python 3中推荐使用super()(无参形式),但需理解其底层机制:
super()等价于super(当前类名, self),自动绑定当前实例。示例:
class Sub(Base): def move(self): super().move() # 自动绑定Sub和selfsuper(type)不绑定实例,适用于类方法或静态方法。示例:
class Base: @classmethod def class_method(cls): print("Base class method")class Sub(Base): @classmethod def class_method(cls): super(Sub).class_method() # 调用父类类方法super(type, obj)绑定到指定对象obj,要求obj是type或其子类的实例。示例:
class Base: def method(self): print("Base method")class Sub(Base): def method(self): super(Sub, self).method() # 显式绑定Sub和selfsuper(type, type2)绑定到类型type2,要求type2是type的子类(较少使用)。
直接调用父类名:需显式传递self,且在多继承中可能导致父类方法被多次调用。示例:
class Base: def __init__(self): print("Base initialized")class Device1(Base): def __init__(self): Base.__init__(self) # 显式传递self print("Device1 initialized")class Device2(Base): def __init__(self): Base.__init__(self) # 显式传递self print("Device2 initialized")class Sub(Device1, Device2): def __init__(self): Device1.__init__(self) # 只调用Device1的初始化 print("Sub initialized")obj = Sub()输出:
Base initialized # 仅一次,因Device2的初始化未被调用Device1 initializedSub initialized问题:若同时调用Device1.__init__和Device2.__init__,Base.__init__会被执行两次。
使用super():通过方法解析顺序(MRO)确保每个父类方法仅调用一次。示例:
class Base: def __init__(self): print("Base initialized")class Device1(Base): def __init__(self): super().__init__() # 自动按MRO调用 print("Device1 initialized")class Device2(Base): def __init__(self): super().__init__() # 自动按MRO调用 print("Device2 initialized")class Sub(Device1, Device2): def __init__(self): super().__init__() # 调用Device1.__init__,进而调用Base.__init__ print("Sub initialized")obj = Sub()输出:
Base initialized # 仅一次Device2 initialized # Device1的super()按MRO调用Device2的初始化Device1 initializedSub initialized关键点:super()遵循MRO顺序,避免重复调用。
Python通过C3算法确定MRO,确保方法调用顺序唯一。查看MRO:
print(Sub.mro()) # 输出类的MRO顺序通过合理使用super(),可以编写更清晰、可维护的继承代码,尤其在复杂继承结构中。