在Python中支持多重继承,父类方法的调用通过线性方法解析顺序(MRO - Method Resolution Order)进行管理。**super()**函数允许调用层次结构中的超类方法,在复杂继承时尤为有用。
**super()**确保根据MRO正确调用方法,而不仅仅是直接父类的方法。
class A: def do(self): print('A') class B(A): def do(self): print('B') super().do() class C(A): def do(self): print('C') super().do() class D(B, C): def do(self): print('D') super().do() D().do() # 输出: # D # B # C # A
细节: 每个方法都必须调用 super(),否则MRO会“破裂”。此外,构造函数(__init__)也应调用 super().__init__()。
问题: 如果在多重继承层次中,有一个类“忘记”在其方法中调用super(),会发生什么?
答案: MRO将被破坏,部分父类方法根本不会被调用。示例:
class A: def show(self): print('A') class B(A): def show(self): print('B') class C(A): def show(self): print('C') super().show() class D(B, C): def show(self): print('D'); super().show() D().show() # 输出:D B # 方法C和A根本没有被调用
故事
super().__init__()。结果是一个小部件未能正确初始化,只有一个罕见的bug“指出”了这一点。故事
故事
在复杂的混合类层次中,重写时一个方法“忘记”调用 super()。这导致一个API端点的验证未能工作,而另一个则工作正常。错误是在几周后通过手动检查MRO时发现的。