Python3 PIL IMAGE 模块和元类

Posted

技术标签:

【中文标题】Python3 PIL IMAGE 模块和元类【英文标题】:Python3 PIL IMAGE module and metaclass 【发布时间】:2014-11-07 15:04:02 【问题描述】:

我想在我的一个类中传递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) 都不是彼此的子类。

【讨论】:

我认为 Image 是模块 PIL 的一个类。那么我们如何在类中使用模块呢?看来我的班级不知道 PIL 和 Image,不过没问题 你可以像在课堂外一样在课堂内使用 Image 模块。 好的,那么我的代码中的其他地方肯定有问题,我现在知道(不)在哪里看,非常感谢您的解释:)

以上是关于Python3 PIL IMAGE 模块和元类的主要内容,如果未能解决你的问题,请参考以下文章

PIL.Image与Base64 String的互相转换

爬虫(十三):PIL模块

OCR-PIL.Image与Base64 String的互相转换

__new__、__init__ 和元类(和超类)

Python3图片处理头像

使用python制作二维码