编程Python高级开发者

解释Python中的继承模型和super()的工作。使用super()在多重继承中的特点是什么,可能会犯哪些错误?

用 Hintsage AI 助手通过面试

答案。

在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根本没有被调用

由于对这一主题细节不熟悉而导致的实际错误示例。


故事

在大型GUI组件的继承中,忘记在一个中间类中调用 super().__init__()。结果是一个小部件未能正确初始化,只有一个罕见的bug“指出”了这一点。

故事

在REST API服务器中,日志记录器依赖于超类,根据MRO应该“连接”到所有请求。一类直接调用了日志记录器,而不是通过super(),导致调用链被破坏,消息未被记录。团队花了很长时间寻找原因。

故事

在复杂的混合类层次中,重写时一个方法“忘记”调用 super()。这导致一个API端点的验证未能工作,而另一个则工作正常。错误是在几周后通过手动检查MRO时发现的。