Python中super()调用三类疑问:MRO逻辑、报错与__init__差异
Python MRO与super()常见问题解析
示例代码
class A: def method(self): print('a is running') super().method() class B: def method(self): print('b is running') super().method() class C: def method(self): print('c is running') class X(A,B): def method(self): print('x is running') super().method() class Y(B,C): pass class P(X,Y,C): def method(self): print('p is running') super().method() print(P.mro()) g=P() g.method()
问题解答
问题1:类A中的super()为何未调用object类?
Python里super()不是固定调用当前类的直接父类,而是基于调用该方法的实例的MRO(方法解析顺序)链,查找当前类在MRO中的下一个类。
以实例g=P()为例,P的MRO是[P, X, A, B, Y, C, object]。当执行A.method()中的super().method()时,会在MRO中找到A的下一个类是B,而非A的直接父类object,因此实际调用的是B.method()。
问题2:在类C中添加super().method()为何触发报错?
当类C的method()中加入super().method()后,执行到这一步时,会按照MRO顺序找到C的下一个类object,尝试调用object.method()。但object类本身并没有定义method()方法,因此会抛出AttributeError。
super()会严格按照MRO链查找对应方法,只要链中后续类没有该方法,就会直接报错,不会自动停止查找。
问题3:在类C中使用super().__init__()为何不报错?
因为object类自带默认的__init__()方法(空实现),当执行super().__init__()时,MRO中C的下一个类是object,调用object.__init__()是合法的,因此不会触发报错。
内容的提问来源于stack exchange,提问作者madhur
相关产品推荐
相关产品推荐

