如何让两个Python抽象类互相实现对方的抽象方法?
问题分析与解决方案
错误原因
当类C继承A2、A1时,Python的方法解析顺序(MRO)为C → A2 → A1 → A0 → ABC → object。由于A2在MRO中优先级高于A1,而A2中声明了抽象方法foo,Python的ABC抽象类机制会判定C的foo方法仍为抽象版本(未被有效实现),因此抛出无法实例化抽象类的错误。
解决方案
方案一:显式调用对应父类的具体方法
直接在C中实现抽象方法,调用对应父类的具体实现逻辑:
from abc import ABC, abstractmethod class A0(ABC): pass class A1(A0, ABC): def foo(self): return 1 @abstractmethod def bar(self): raise NotImplementedError() class A2(A0, ABC): @abstractmethod def foo(self): raise NotImplementedError() def bar(self): return 10 class C(A2, A1, A0): def foo(self): return A1.foo(self) def bar(self): return A2.bar(self) def all(self): return (self.foo(), self.bar()) print(C().all()) # 输出: (1, 10)
方案二:利用super()跳过抽象方法调用
通过super()指定跳过优先级高的抽象方法,调用MRO中后续父类的具体实现:
from abc import ABC, abstractmethod class A0(ABC): pass class A1(A0, ABC): def foo(self): return 1 @abstractmethod def bar(self): raise NotImplementedError() class A2(A0, ABC): @abstractmethod def foo(self): raise NotImplementedError() def bar(self): return 10 class C(A2, A1, A0): def foo(self): # 跳过A2的抽象foo,调用A1的具体实现 return super(A2, self).foo() def all(self): # bar方法直接使用A2的具体实现 return (self.foo(), super().bar()) print(C().all()) # 输出: (1, 10)
内容的提问来源于stack exchange,提问作者Yang Bo
相关产品推荐
相关产品推荐

