Python ABC 多重继承

标签 python python-2.7 multiple-inheritance metaclass urwid

我认为代码会比我用文字更好地解释问题。这是 my_abc.py 中的代码:

from abc import ABCMeta, abstractmethod

class MyABC(object):
    __metaclass__ = ABCMeta

    @abstractmethod
    def print(self):
        pass

这是my_class.py中的代码

from my_abc import MyABC
from third_party_package import SomeClass

class MyClass(MyABC, SomeClass):
    def __init__(self):
        super(MyClass, self).__init__()

    def print(self):
        print('Hello ABC')

当我尝试运行 my_class.py 时,我得到:

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

我知道我可以创建一个直接从我的接口(interface) MyABC 继承的类,然后创建另一个类,然后从我创建的这个类和我的第三方模块类继承。

我的问题是:是否有另一种更好、更正确的方法可以直接执行此操作而无需为我的目的创建中间类?

最佳答案

SomeClass 类有一个自定义的元类。您需要创建一个继承自 ABCMeta 和此自定义元类的元类,然后将其用作 MyClass 的元类。在不了解此自定义元类的更多信息的情况下,我无法确定在一般情况下执行此操作的正确方法,但它可能看起来像以下可能性之一:

class DerivedMeta(ABCMeta, type(SomeClass)):
    pass

class DerivedMeta(type(SomeClass), ABCMeta):
    pass

这不太可能,但您可能还需要重写一个或多个方法以确保正确的元类交互。

关于Python ABC 多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28799089/

相关文章:

python - 使用 Nginx 在树莓派上部署 Flask

python - 从 Pandas 文本中删除unicode

Python 在另一个文件中导入模块

c++ - 多重继承和重复函数调用

python - python从派生类对象调用基类的方法

python - 抽象 Django 模型中的 app_label

python - 如何获取文本文件第一列的唯一元素?

python - python 2.7.5 中的 str() 与 repr() 函数

python - ast.literal_eval 用于 python 中的变量?

python - Django 动态过滤器集