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

Python类多继承优先级问题:如何让super()按预期工作?

解决Python多继承中方法调用优先级问题

问题原因

你的代码里D().foo()返回CCCBBB,核心原因是Python的方法解析顺序(MRO):
D的MRO链是 D → B → C → A。当B的foo方法调用super().foo()时,会沿着MRO链找B之后第一个实现foo的类,也就是C,而非A,所以最终拼接出CCC + BBB。

解决方案

方案1:重构Mixin类为纯功能扩展(推荐)

Mixin的设计初衷是添加额外功能,而非覆盖基类方法。把C改成不继承A的纯Mixin类,只保留新增的bar方法,这样既不会干扰B对foo的逻辑,又能让D获得bar功能:

class A:
    def foo(self):
        return "AAA"

class B(A):
    def foo(self):
        return super().foo() + "BBB"

# 纯Mixin:只提供新增方法,不继承业务基类
class C:
    def bar(self):
        return "Other logic"

class D(B, C):
    pass

print(D().foo())  # 输出 AAABBB
print(D().bar())  # 输出 Other logic

方案2:在D中显式指定调用B的foo逻辑

如果C必须继承A,可以在D中重写foo,同时调整B中super的调用逻辑,确保它指向A的foo:

class A:
    def foo(self):
        return "AAA"

class B(A):
    def foo(self):
        # 显式指定super的类参数,确保调用A的foo,不受后续继承链影响
        return super(B, self).foo() + "BBB"

class C(A):
    def foo(self):
        return "CCC"

    def bar(self):
        return "Other logic"

class D(B, C):
    def foo(self):
        return B.foo(self)

print(D().foo())  # 输出 AAABBB
print(D().bar())  # 输出 Other logic

方案1更符合Mixin的设计原则,能从根源避免多继承的方法冲突问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:12:16