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
相关产品推荐
相关产品推荐

