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

Python多层继承调用基类方法出现super对象无属性报错如何解决

问题原因分析
  • 你原有代码中super(A, self)报错的核心原因是Python的super基于方法解析顺序(MRO)工作:super(cls, instance)会返回MRO序列中排在cls之后的类的代理对象。D类的MRO序列为[D, C, B, A, object],所以super(A, self)会去查找A之后的object类的do_something方法,自然会报属性不存在的错误。
  • 你之前尝试的A(self).do_something()属于错误的实例化操作:这种写法会先创建一个新的A类实例,触发A的__init__方法,所以当A的构造函数需要参数时就会报错,不属于调用当前实例继承的A类方法的正确写法。
正确实现方案

直接显式调用指定基类的实例方法,将当前实例self作为第一个参数传入即可,该写法不会触发基类的构造函数:

class D(C):
    def do_something(self):
        # 直接调用A类的do_something方法,传入当前实例self
        A.do_something(self)
        print('Class D')

运行结果完全符合预期:

>>> D().do_something()
Class A
Class D

如果你非要用super实现也可以,把super的第一个参数设为A在MRO中的前一个类B即可:

class D(C):
    def do_something(self):
        # MRO中B的下一个类是A,所以会调用A的do_something
        super(B, self).do_something()
        print('Class D')

相对而言显式调用基类方法的写法更直观,更符合明确跳过中间层、调用指定基类的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 00:09:04