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

Python多继承调用父类方法:为何A的m()仅执行一次?

Python多继承中父类方法仅调用一次的原因

先看你的代码:

class A:
    def m(self):
        print(f"m of A called")
class B(A):
    def m(self):
        print("m of B called")
        super().m()
class C(A):
    def m(self):
        print("m of C called")
        super().m()
class D(B,C):
    def m(self):
        print("m of D called")
        super().m()

x = D()
x.m()

执行输出:

m of D called
m of B called
m of C called
m of A called

核心原因:Python的MRO与super()的工作逻辑

你误以为A的m()会被调用两次,是因为错把super().m()当成了直接调用当前类的父类方法,但实际上Python里的super()是按照类的方法解析顺序(MRO)去查找下一个类的对应方法,而非直接指向父类。

对于类D来说,它的MRO顺序是:D → B → C → A → object。

调用流程拆解:

  1. 调用x.m(),先执行D的m(),打印m of D called,然后执行super().m(),按照MRO找到B的m()。
  2. 执行B的m(),打印m of B called,然后执行super().m(),此时不是去找B的父类A,而是按MRO顺序找到B的下一个类C,调用C的m()。
  3. 执行C的m(),打印m of C called,然后执行super().m(),按MRO找到A的m()。
  4. 执行A的m(),打印m of A called,A的m()里没有super(),流程结束。

整个过程沿着MRO链走一遍,每个类的m()只被调用一次,所以A的方法只会执行一次,不会被B和C各自触发一次。

内容的提问来源于stack exchange,提问作者sbooyah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:17:04