扩展作为结构

时间:2015-11-22 17:46:44

标签: python pyqt can-bus

我正在使用Python canmatrix library(现在我的Python3 fork),它提供了一组用于CAN网络消息的内存描述的类以及用于导入和导出到的脚本从磁盘表示(各种标准CAN描述文件格式)。

我正在使用canmatrix库编写PyQt应用程序,并希望在底层Signal类中添加一些小的附加功能。请注意,CanMatrix会组织其成员Frame,后者又会组织其成员Signal。整个结构由读取文件的导入脚本创建。我想保留每个图层的导入脚本和子成员查找器功能,但是为Signal类添加一个额外的'value'成员以及可以触发Qt信号的getter / setter(与canmatrix无关) Signal个对象)。

标准的继承方法似乎要求我对库中的每个类进行子类化,并覆盖创建库Signal的每个函数来代替使用我的类。同样适用于导入功能。对于向库中添加非侵入式功能而言,这似乎非常过分。

我尝试继承和替换我继承的库类(使用和不使用传递构造函数),但导入仍然创建库类,而不是我的。我忘记了是否从this other answer复制了这个,但它与那里引用的结构相同。

class Signal(QObject, canmatrix.Signal):
    _my_signal = pyqtSignal(int)

    def __init__(self, *args, **kwargs):
        canmatrix.Signal.__init__(self, *args, **kwargs)
        # TODO: what about QObject
        print('boo')

    def connect(self, target):
        self._my_signal.connect(target)

    def set_value(self, value):
        self._my_value = value
        self._my_signal.emit(value)

canmatrix.Signal = Signal
print('overwritten')

我的尝试是否存在直接错误?

我这样做是错误的,需要找一些(其他)设计模式吗?

我的下一次尝试涉及遮蔽库类的每个实例。对于我想要添加功能的库类的任何实例,我必须构造一个将自己与库类对象相关联的对象。然后,通过一个额外的层,我可以从任何一个对象到另一个对象。

class Signal(QObject):
    _my_signal = pyqtSignal(int)

    def __init__(self, signal):
        signal.signal = self
        self.signal = signal
        # TODO: what about QObject parameters
        QObject.__init__(self)
        self.value = None

    def connect(self, target):
        self._my_signal.connect(target)

    def set_value(self, value):
        self.value = value
        self._my_signal.emit(value)

额外的图层很烦人(library_signal.signal.set_value()而不是library_signal.set_value()),并且相互参照似乎可以防止两个对象被清理干净。

这确实运行并运行,但我怀疑还有更好的方法。

0 个答案:

没有答案
相关问题