You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 06:20:28