【问题标题】:How is one meant to use the collections.abc classes with multiple inheritance?如何使用具有多重继承的 collections.abc 类?
【发布时间】:2016-10-12 12:08:24
【问题描述】:

我遇到了一个问题,我想使用来自 collections.abc.MutableSequence 的 mixin 方法,但我还必须从其他东西继承。

class Thing(urwid.Pile, collections.abc.MutableSequence):
    ...

我结束了

TypeError: metaclass conflict: the metaclass of a derived class must be
a (non-strict) subclass of the metaclasses of all its bases

我如何确定发生了什么并解决它? metaclass = ABCMeta 不值一提。

【问题讨论】:

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


    【解决方案1】:

    metaclass=ABCMeta 的问题。 MutableSequence 使用 ABCMeta 作为其元类,Pile 使用其他东西,因此发生冲突。

    你可以做的是从Pile继承并使用MutableSequence.register(),像这样:

    class Thing(urwid.Pile):
        ...
    
    collections.abc.MutableSequence.register(Thing)
    

    如果您的 Thing 没有实现所有必需的方法,您将不会遇到异常,但是 issubclass(Thing, MutableSequence)isinstance(Thing(), MutableSequence) 将返回 True。

    【讨论】:

    • 谢谢。 class ABCMetaWidgetMeta(urwid.WidgetMeta, ABCMeta): pass 并将其设置为元类似乎也解决了它。
    • @dwf:注意WidgetMeta 必须与ABCMeta 兼容,您的ABCMetaWidgetMeta 才能正常工作。有时,如果没有任何代码行,继承就不会“正常工作”
    • 当然。 :) 在这种情况下,它们是完全正交的。 WidgetMeta 只是做了一些属性缓存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多