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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:14:20