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。
调用流程拆解:
- 调用
x.m(),先执行D的m(),打印m of D called,然后执行super().m(),按照MRO找到B的m()。 - 执行B的
m(),打印m of B called,然后执行super().m(),此时不是去找B的父类A,而是按MRO顺序找到B的下一个类C,调用C的m()。 - 执行C的
m(),打印m of C called,然后执行super().m(),按MRO找到A的m()。 - 执行A的
m(),打印m of A called,A的m()里没有super(),流程结束。
整个过程沿着MRO链走一遍,每个类的m()只被调用一次,所以A的方法只会执行一次,不会被B和C各自触发一次。
内容的提问来源于stack exchange,提问作者sbooyah
相关产品推荐
相关产品推荐

