没有“一致方法解析”错误的两级抽象类层次结构
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 访问它们?