没有“一致的方法解析”错误的两级抽象类层次结构

时间:2016-12-21 21:05:05

标签: python python-3.x multiple-inheritance abc

我需要两个级别的抽象类和一个第三级具体类:

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,因为它不再是抽象的了。

2 个答案:

答案 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 的好处是你不能把它放在列表的开头。