Python, смешивание PyQt5 и abc.ABCMeta

Я пытаюсь создать AbstractClass, используя как abc.ABCMeta, так и QObject в качестве родителей, и, похоже, не могу заставить его работать.

Вот инициализация базового класса. У меня есть Pyqt5 и Python 2.7.

pyqtWrapperType = type(QObject)

class ParamsHandler(abc.ABCMeta, pyqtWrapperType):
    def __init__(self, device_model, read_only=False):
        super(ParamsHandler, self).__init__()
        self.cmd_to_get_data = None
        self.device_model = device_model

class ConfigParamsHandler(ParamsHandler):
    def __init__(self, device_model):
        super(ConfigParamsHandler, self).__init__(device_model)
        self.cmd_to_get_data = Commands.CONFIG_PARAMS

Я получаю TypeError('new() принимает ровно 4 аргумента (2 задано)',) У меня также есть Pycharm, предлагающий использовать cls вместо self

Если я указываю 4 аргумента, он запрашивает строку в качестве первого аргумента.


person PBareil    schedule 20.03.2018    source источник


Ответы (2)


abc.ABCMeta предполагается использовать в качестве метакласса. Поэтому вместо расширения попробуйте:

class ParamsHandler(pyqtWrapperType):
    __metaclass__ = abc.ABCMeta
person Fred    schedule 20.03.2018
comment
Конечно! Я изменил это, но все равно получаю TypeError('type() принимает 1 или 3 аргумента',) . Я создаю экземпляр класса ConfigParamsHandler(device_model) - person PBareil; 20.03.2018
comment
Отредактировал ответ - person Fred; 20.03.2018
comment
@Фред. Тип QObject определенно не type: на самом деле это sip.wrappertype. Ваш текущий код вызовет TypeError (из-за конфликта метаклассов). - person ekhumoro; 20.03.2018

Вместо этого я решил использовать этот подход:

class ParamsHandler_Meta(type(QObject), type(abc.ABCMeta)):
    pass
class ParamsHandlerClass(QObject):
    pass
class ParamsHandler(ParamsHandlerClass):
    __metaclass__ = ParamsHandler_Meta
    def __init__(self, device_model, cmd_to_get_data, read_only=False):
        super(ParamsHandler, self).__init__()
        self.cmd_to_get_data = cmd_to_get_data
person PBareil    schedule 20.03.2018