错误消息表明您在层次结构中的某个位置有两个冲突的元类。您需要检查每个类和QT类,以找出冲突的位置。
这是设置相同情况的一些简单示例代码:
class MetaA(type):
pass
class MetaB(type):
pass
class A:
__Metaclass__ = MetaA
class B:
__Metaclass__ = MetaB
我们不能直接对这两个类进行子类化,因为python不知道要使用哪个元类:
>>> class Broken(A, B): pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
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
错误试图告诉我们的是,我们需要通过引入第三个元类来解决这两个元类之间的冲突,这是基类中所有元类的子类。
我不确定是否比错误消息本身更清晰,但是基本上,您可以通过执行以下操作来修复它:
class MetaAB(MetaA, MetaB):
pass
class Fixed(A, B):
__Metaclass__ = MetaAB
现在,此代码可以编译并正确运行。当然,在实际情况下,您的解决冲突的元类将不得不决定采用哪种父元类行为,您必须根据应用程序的需求自行确定哪些行为。
记住,你的继承类只得到 一个 两元类的。__init__
方法有时会完成所有工作,因此在许多情况下,您将不得不添加一个__init__
以某种方式调用两者的方法,以帮助他们相处。