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

Python多继承方法调用顺序解析:为何多继承下未执行所有父类的同名方法?

为什么多继承下super()只调用了第一个父类的方法?

嘿,这个问题其实戳中了Python多继承里**方法解析顺序(MRO)**和super()工作机制的关键点,我来给你理清楚~

首先得明确:super()并不是直接调用“父类”的方法,而是按照当前类的MRO链(方法解析顺序)去寻找下一个类的同名方法。你可以通过print(Class4.__mro__)查看Class4的MRO,输出会是:

(<class '__main__.Class4'>, <class '__main__.Class2'>, <class '__main__.Class3'>, <class 'object'>)

当你在Class4的m()里调用super().m()时,它会顺着MRO链找到下一个类——也就是Class2的m()方法。但问题在于,Class2的m()里没有继续调用super().m(),这条调用链到Class2就中断了,自然不会触发Class3的m()。

如果想让所有父类的m()都执行,得让每个类的m()都把调用传递下去才行。修改后的代码如下:

class Class2:
    def m(self):
        print("In Class2")
        super().m()  # 加上这行,让调用继续沿着MRO链传递

class Class3:
    def m(self):
        print("In Class3")

class Class4(Class2, Class3):
    def m(self):
        print("In Class4")
        super().m()

obj = Class4()
obj.m()

现在执行这段代码,输出就会变成你预期的样子:

In Class4
In Class2
In Class3

这里要注意:哪怕Class2和Class3之间没有继承关系,super().m()在Class2里依然能找到Class3的m(),这就是MRO的作用——它把多继承的类整理成了一个线性的调用顺序,避免了复杂的继承歧义。

如果你不想用链式调用,也可以手动调用每个父类的方法,但这种方式会绕开MRO,在复杂继承结构里容易出现重复调用或遗漏的情况,比如:

class Class4(Class2, Class3):
    def m(self):
        print("In Class4")
        Class2.m(self)
        Class3.m(self)

这种写法虽然能得到预期输出,但并不推荐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 12:03:13