Python3 PIL IMAGE模块和元类

时间:2014-09-13 16:16:33

标签: python python-imaging-library metaclass

我想在我的一个班级中传递PIL模块的类Image,所以我自然写了:

import sys
from PIL import Image
from PyQt4 import QtCore, QtGui


class BitsWindow(QtGui.QWidget, Image):

但是我收到了这个错误:

class BitsWindow(QtGui.QWidget,Image): TypeError:元类冲突:派生类的元类必须是其所有基类的元类的(非严格)子类

我已经在网上看到了关于这个错误的一些答案,但是我并没有真正理解这一点而且我不知道为什么我使用QT类没有问题,就像我尝试使用PIL类一样...

非常感谢 团块

1 个答案:

答案 0 :(得分:1)

Image是一个模块,而不是一个类。

In [126]: type(Image)
Out[126]: module

类是从type派生的。 Image不是来自type

In [128]: type(Image).__mro__
Out[129]: (module, object)

因此,您无法将其用作基类:

In [127]: class BitsWindow(Image): pass
...
TypeError: Error when calling the metaclass bases
    module.__init__() takes at most 2 arguments (3 given)

您看到的错误,

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

表示类的所有基类必须具有相同的元类,或者至少必须有元类的顺序,使得每个类都是下一个的子类。一个派生类不能继承两个元类,这是有道理的,因为每个类都是其元类的一个实例。

在您的特定情况下,会引发错误,因为type(Image)type(QWidget)都不是彼此的子类。