Python 结合Qgraphics和sqlalchemy时出现元类错误

Python 结合Qgraphics和sqlalchemy时出现元类错误,python,sqlalchemy,pyside,metaclass,Python,Sqlalchemy,Pyside,Metaclass,我想使用sqlalchemy使QGraphicsItems持久化。轻松地将基类与PySide类组合会导致元类错误。metaclsses主题是Python的魔力,我不想在不需要它的时候深入探讨它。 有没有简单的方法来解决这个元类冲突 class MarketItem(Base, QtGui.QGraphicsEllipseItem, QtGui.QListWidgetItem): """ """ __tablename__ = "marketitem"

我想使用sqlalchemy使
QGraphicsItem
s持久化。轻松地将基类与PySide类组合会导致元类错误。metaclsses主题是Python的魔力,我不想在不需要它的时候深入探讨它。 有没有简单的方法来解决这个元类冲突

class MarketItem(Base, QtGui.QGraphicsEllipseItem, QtGui.QListWidgetItem):
    """
    """
        __tablename__       = "marketitem"
    Id                  = Column(Integer(4), primary_key=True)
    name                = Column(String(40))
    x_pos               = Column(Integer(4))
    y_pos               = Column(Integer(4))
    def __init__(self, x_pos, y_pos, scene, name, style=QtCore.Qt.SolidLine,
                 rect=None, matrix=QtGui.QTransform(), cat = None):
        super(MarketItem, self).__init__()
        self.setFlags(QtGui.QGraphicsItem.ItemIsSelectable|
                      QtGui.QGraphicsItem.ItemIsMovable|
                      QtGui.QGraphicsItem.ItemIsFocusable)
        self.pos = QtCore.QPoint(x_pos, y_pos)
        self.x_pos = x_pos
        self.y_pos = y_pos
        self.name = name
给出了错误:

  File "C:\Users\Richard\Documents\manAmpl\aptana\mampl\pm15ConeModel.py", line 47, in <module>
    class MarketItem(Base, QtGui.QGraphicsEllipseItem, QtGui.QListWidgetItem):
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
文件“C:\Users\Richard\Documents\manAmpl\aptana\mampl\pm15ConeModel.py”,第47行,在
类MarketItem(Base,QtGui.QGraphicsEllipseItem,QtGui.QListWidgetItem):
TypeError:调用元类基时出错
元类冲突:派生类的元类必须是其所有基元类的(非严格)子类

谢谢你,Richard,前面有人问了一个类似的问题,这帮助我为你找到了一个可能的解决方案

class CommonMetaclass(type(QtCore.Qt), type(Base)):
    pass

class MarketItem(QtGui.QGraphicsEllipseItem, QtGui.QListWidgetItem, Base):
    __metaclass__ = CommonMetaclass
    __tablename__ = "marketitem"
    ...
我可以这样声明这个类,但不确定它是否真的可用

如果有不正确的地方,请尝试更改这两个类定义中父类的顺序


对于Python3,这段代码需要稍加修改,但您没有提到Python3,遗憾的是,版本2现在是“默认版本”…

前面也提出过类似的问题,它帮助我为您提供了一个可能的解决方案

class CommonMetaclass(type(QtCore.Qt), type(Base)):
    pass

class MarketItem(QtGui.QGraphicsEllipseItem, QtGui.QListWidgetItem, Base):
    __metaclass__ = CommonMetaclass
    __tablename__ = "marketitem"
    ...
我可以这样声明这个类,但不确定它是否真的可用

如果有不正确的地方,请尝试更改这两个类定义中父类的顺序


对于Python 3,这段代码需要稍加修改,但您没有提到Python 3,而且,很遗憾,版本2现在是“默认”版本…

这看起来是一个需要的简单案例,但我没有足够的信心将其称为答案。它看起来是一个需要的简单案例,但我没有足够的信心来回答这个问题。请进一步解释:在这种情况下,基类和类的元类是什么?(Qt类是一个扩展,是C语言Qt库的包装。“基类”是sqlalchemy模块通过调用声明性的_Base()方法生成的类。问题没有显示为派生类MarketItem声明的元类属性,所以它的元类是什么?)错误消息是希望派生类的元类是所有基类元类集合的子集,还是仅仅是最终基类(对于Qt类,“type”和sqlalchemy类是什么?)?请进一步解释:在这种情况下,基类和类的元类是什么?(Qt类是一个扩展,是C语言Qt库的包装。“基类”是sqlalchemy模块通过调用声明性的_Base()方法生成的类。问题没有显示为派生类MarketItem声明的元类属性,所以它的元类是什么?)错误消息是希望派生类的元类是所有基类元类集合的子集,还是仅仅是最终基类(对于Qt类,“type”和sqlalchemy类是什么?)?