【发布时间】:2015-05-02 04:09:22
【问题描述】:
我认为代码比我用文字更能解释问题。这是 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 继承的类,然后创建另一个类,然后从我创建的这个类和我的第三方模块类继承。
我的问题是:是否有另一种更好、更合适的方式直接执行此操作,而无需为我的目的创建中间类?
【问题讨论】:
-
您建议的解决方法是否真的有效?如果您在
MyABC和MyClass之间放置另一个类,我希望您会遇到完全相同的问题。问题是SomeClass具有不同且不兼容的元类。在不知道那是什么的情况下,我不确定是否有任何方法可以回答这个问题。你能补充一些关于SomeClass的具体细节吗? -
我正在使用一个名为 urwid 的第三方库。它是 python 的 ncurses 替代品,具有更清洁的 API。根据我上面提供的示例, SomeClass 对应于 urwid.ListBox 类,它是用于创建类似 UI 组件的列表框的小部件。我不确定如何找出 urwid.ListBox 的元类,但是当我使用上面的代码运行它时,我得到了相同的 TypeError。
-
尝试创建一个中间元类:
class MyMeta(ABCMeta, type(SomeClass)): pass,然后将其用作__metaclass__的MyClass。
标签: python python-2.7 multiple-inheritance metaclass urwid