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

Posted

技术标签:

【中文标题】没有“一致方法解析”错误的两级抽象类层次结构【英文标题】:Two-level abstract class hierarchy without 'consistent method resolution' error 【发布时间】:2017-05-07 09:57:47 【问题描述】:

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

from abc import ABC

class Shape(ABC):
...

class Quad(ABC, Shape):
...

class Square(Quadrilateral)
...

此代码根据Quad 的声明生成TypeError: Cannot create a consistent method resolution。我意识到问题是多重继承的歧义。 Quad 不知道是直接从ABC 还是从Shape 派生某些函数,但是我该如何解决呢?我不能从Quad 的声明中删除ABC,因为那样它就不再是抽象的了。

【问题讨论】:

ABC 来自哪里?是abc.ABC吗?你能给个minimal reproducible example吗? 这是创建抽象类的标准 Pythonic 方式:from abc import ABC 然后把它放在问题中。请edit,并提供更少抽象(且更内部一致)的示例。 好的 jonrsharpe。我添加了它。我认为可以在关于抽象类的 Python 问题中假设 ABC。对不起。 请注意 class Quad(Shape, ABC): 没有此错误 - 参见例如***.com/a/3003284/3001761 【参考方案1】:

这在abc documentation中有解释:

请注意,ABC 的类型仍然是 ABCMeta,因此从 ABC 继承需要注意有关元类使用的常规预防措施,因为多重继承可能会导致元类冲突。还有一个直接使用ABCMeta的例子。

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

from abc import ABC

class Shape(metaclass=ABCMeta):
...

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

class Square(Quadrilateral)
...

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

【讨论】:

【参考方案2】:

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

类四边形(形状,ABC)

【讨论】:

以上是关于没有“一致方法解析”错误的两级抽象类层次结构的主要内容,如果未能解决你的问题,请参考以下文章

如何创建类型化工厂方法构造函数的类层次结构并使用抽象类型从 Scala 访问它们?

Java 8 - 与默认方法和抽象类的接口

漫谈设计模式:桥接(Bridge)模式 —— 将类功能结构两层次分离

可克隆的类层次结构和 unique_ptr

Java Review (十面向对象----抽象类)

Java Review (十面向对象----抽象类)