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

