Python中super()用法疑问:多继承场景下方法调用结果困惑
为什么你的代码输出是C而不是A?
嘿,我完全理解你的困惑——多继承下的方法查找确实容易让人绕晕!先把你的代码贴出来方便分析:
class A: def foo(self): return 'A' class C(A): def foo(self): return 'C' class J(A): pass class E(J, C): def f(self): return super().foo() def foo(self): return 'E' print(E().f()) # 输出C,不是预期的A
核心问题出在Python的**方法解析顺序(MRO)**上,Python用C3线性化算法来生成多继承类的方法查找顺序,确保不会出现歧义。你提到的E的完整MRO是:E -> J -> C -> A -> object
那super().foo()在E.f()里到底做了什么?
super()在没有指定参数的情况下,会从当前类(E)的MRO列表中,找到下一个类开始查找方法。- 首先跳过E自己的
foo(因为super是找父类链的方法),然后看J——J继承了A但没有重写foo,所以继续往下找MRO的下一个类:C。 - C重写了
foo方法,所以直接调用C的foo,返回'C',根本轮不到A的foo。
如果你的目标是调用A的foo,可以显式指定super的参数,比如修改f方法:
def f(self): return super(J, self).foo() # 从J的下一个类开始找,也就是C之后的A
这样就能得到预期的'A'了。
记住一个关键点:super()不是单纯找“父类”,而是严格按照MRO列表的顺序,从当前类的下一个位置开始查找第一个匹配的方法。多继承场景下,一定要先确认类的MRO顺序,就能避免这类困惑啦!
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

