4

我需要两级抽象类和第三级具体类:

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,但我该如何解决?我不能ABCQuad' 的声明中删除,因为那样它就不再是抽象的了。

4

2 回答 2

4

显然,只需将父类的顺序反转为 Quad 即可解决问题。我仍然不清楚基本理论(尽管可以推断出来),但至少我的代码现在正在运行。

四边形类(形状,ABC)

于 2016-12-21T21:29:48.597 回答
0

这在abc 文档中进行了解释:

请注意,ABC 的类型仍然是 ABCMeta,因此从 ABC 继承需要在元类使用方面采取通常的预防措施,因为多重继承可能会导致元类冲突。还有一个如何直接使用 ABCMeta 的示例。

这样,您的代码将如下所示:

from abc import ABC

class Shape(metaclass=ABCMeta):
...

class Quad(Shape, metaclass=ABCMeta):
...

class Square(Quadrilateral)
...

我不知道为什么当 ABC 是列表中的最后一个类时它会起作用,但是使用 ABCMeta 的好处是你不能把它放在列表的开头。

于 2021-05-04T20:29:45.450 回答