【问题标题】: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): 没有此错误 - 参见例如stackoverflow.com/a/3003284/3001761

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


【解决方案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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      相关资源
      最近更新 更多