我需要两个级别的抽象类和一个第三级具体类:
from abc import ABC
class Shape(ABC):
...
class Quad(ABC, Shape):
...
class Square(Quadrilateral)
...
此代码针对TypeError: Cannot create a consistent method resolution
的声明生成Quad
。我意识到问题是多重继承歧义。 Quad
不知道是直接从ABC
还是从Shape
派生某些功能,但我该如何解决?我不能从ABC
的声明中删除Quad
,因为它不再是抽象的了。
答案 0 :(得分:1)
显然,简单地将父类的顺序反转为Quad可以解决问题。我仍然不清楚基础理论(尽管可以推断它),但至少我的代码现在正在运行。
四级(形状,ABC)
答案 1 :(得分:0)
这在 abc documentation 中有解释:
<块引用>请注意,ABC 的类型仍然是 ABCMeta,因此从 ABC 继承需要有关元类使用的通常预防措施,因为多重继承可能会导致元类冲突。还有一个例子如何直接使用ABCMeta。
这样,您的代码将如下所示:
from abc import ABC
class Shape(metaclass=ABCMeta):
...
class Quad(Shape, metaclass=ABCMeta):
...
class Square(Quadrilateral)
...
我不知道为什么当 ABC 是列表中的最后一个类时它会起作用,但是使用 ABCMeta 的好处是你不能把它放在列表的开头。