【问题标题】:Python, mixing PyQt5 and abc.ABCMetaPython,混合 PyQt5 和 abc.ABCMeta
【发布时间】:2018-08-29 06:20:29
【问题描述】:

我正在尝试使用 abc.ABCMeta 和 QObject 作为父级创建一个 AbstractClass,但似乎无法使其工作。

这里是基类初始化。我有 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 个参数,它会要求一个字符串作为第一个参数。

【问题讨论】:

    标签: python pyqt python-2.x metaclass cls


    【解决方案1】:

    abc.ABCMeta 应该用作元类。因此,不要扩展它,而是尝试:

    class ParamsHandler(pyqtWrapperType):
        __metaclass__ = abc.ABCMeta
    

    【讨论】:

    • 当然!我改变了它,但我仍然得到一个 TypeError('type() 需要 1 或 3 个参数',) 。我实例化类ConfigParamsHandler(device_model)
    • 编辑了答案
    • @Fred。 QObject 的类型肯定不是type:它实际上是sip.wrappertype。您当前的代码将引发 TypeError(由于元类冲突)。
    【解决方案2】:

    我用这种方法解决了这个问题:

    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
    

    【讨论】:

      猜你喜欢
      • 2011-05-09
      • 1970-01-01
      • 2016-06-10
      • 2012-03-18
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      相关资源
      最近更新 更多