Множественное наследование с Peewee Model и QtCore QObject, вызывающее конфликт метакласса - PullRequest
0 голосов
/ 30 августа 2018

Прежде всего, я новичок в python, и это мой первый пост, поэтому, пожалуйста, дайте мне знать, если я что-то здесь не так сделал, и я с удовольствием это исправлю.

Я использую Python 2.7.15rc1 и Peewee 3.6.4

Я пытаюсь создать класс, унаследованный от модели peewee, а также от QObject PySide.QtCore. Просто так:

class BaseModel(Model, QObject):

id = PrimaryKeyField()

class Meta:
    database = db  

def __str__(self):
    return str(self.__dict__)

def __eq__(self, other): 
    return self.id == other.id

Но эта конфигурация приносит мне следующую ошибку:

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

Если я попытаюсь указать Model в качестве желаемого метакласса (и я думаю, что это нормально, потому что в основном мне нужно только, чтобы отношение «is» с QObject было истинным), добавив его в BaseModel:

__metaclass__ = Model

Выдается следующая ошибка:

AttributeError: 'Model' object has no attribute '_meta'

также, перейдя по этой ссылке , я изменил код на:

class A (Model):
    pass
class B (QObject):
    pass
class C(A, B):
    pass

class BaseModel(A, B):

    __metaclass__ = C

    id = PrimaryKeyField()

    class Meta:
        database = db  

    def __str__(self):
        return str(self.__dict__)

    def __eq__(self, other): 
        return self.id == other.id

Но конфликт метаклассов сохраняется.

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 31 августа 2018

Хорошо. Наконец я смог решить это, выполнив следующее:

class Metaclass_Model(Model.__class__):
    pass
class Metaclass_QObject(QObject.__class__):
    pass

class MultiMetaclass(Metaclass_Model, Metaclass_QObject):
    pass


class BaseModel(Model, QObject):

    __metaclass__ = MultiMetaclass

    id = PrimaryKeyField()

    class Meta:
        database = db  

    def __str__(self):
        return str(self.__dict__)

    def __eq__(self, other): 
        return other is not None and self.id == other.id

Работает нормально, хотя Eclipse продолжает показывать эту ошибку:

Undefined variable from import: __class__

в этой строке:

class Metaclass_Model(Model.__class__):
...