我正在使用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()
),并且相互参照似乎可以防止两个对象被清理干净。
这确实运行并运行,但我怀疑还有更好的方法。