Python ABC多重继承

问题描述 投票:3回答:2

我认为代码将比用文字更好地解释问题。这是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:调用元类基类元类冲突时出错:派生类的元类必须是其所有基类的元类的(非严格)子类

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

我的问题是:是否有另一种更好,更正确的方法直接这样做,而不必为我的目的创建一个中间类?

python python-2.7 multiple-inheritance metaclass urwid
2个回答
4
投票

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

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

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

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


0
投票

您还可以将其他类的元类设置为ABCMeta,以便所有多个基类的元类都是ABCMeta。

使用多重继承时,我遇到了类似的问题:

  • 具有自定义元类的类
  • ABCMeta作为元类的一类

我所做的就是让我的自定义元类派生自ABCMeta。这似乎适用于所有情况。

在所有情况下,这对我有用。

class MyMeta(ABCMeta):
  pass

代替

class MyMeta(type):
  pass
© www.soinside.com 2019 - 2024. All rights reserved.