2014-09-13 3 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, изображение): TypeError: метаклассом конфликт: метаклассом производного класса должен быть (нестрогие) подкласс метаклассами всех своих баз

Я прочитал в интернете несколько ответов об этой ошибке, но я действительно не понимаю, и я не понимаю, почему у меня нет проблем с использованием QT класс точно так же я попробовать использовать класс PIL ...

Большое спасибо Blob

ответ

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

Я думал, что изображение было классом модуля PIL. Итак, как мы используем модуль внутри класса? Кажется, мой класс не знает о PIL и Image, никаких проблем за его пределами, но –

+0

Вы можете использовать модуль Image внутри класса так же, как и вне класса. – unutbu

+0

Хорошо, что-то определенно неправильно где-то в моем коде, тогда я знаю, где (не) смотреть сейчас, большое спасибо за объяснение:) –

Смежные вопросы