2014-09-13 63 views
1

我想通過PIL模塊類圖片在我班上的一個,所以我很自然地寫:Python3 PIL IMAGE模塊和元類

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


class BitsWindow(QtGui.QWidget, Image): 

但我得到這個錯誤:

類BitsWindow(QtGui.QWidget,Image): TypeError:元類衝突:派生類的元類必須是其所有基類元類的(非嚴格)子類

我已經在網上閱讀了幾個答案關於這個錯誤,但我真的不明白它和我不知道爲什麼我使用QT類完全相同的方式,我嘗試使用PIL類都沒有問題......

非常感謝 斑點

回答

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)都不是彼此的子類。

+0

我以爲Image是模塊PIL的一個類。那麼我們如何在課堂中使用模塊?看起來我的班級不知道PIL和圖像,雖然 – 2014-09-13 21:23:31

+0

以外沒有任何問題,但您可以像在班級以外一樣使用班級內的圖像模塊。 – unutbu 2014-09-13 21:26:44

+0

好吧,在我的代碼的其他地方肯定有錯,然後我知道現在在哪裏(非),非常感謝你的解釋:) – 2014-09-14 08:45:55