在PySide 信号和插槽页面上它说:“信号是实例拥有的运行时对象,它们不是类属性”。显然,QObject 构造函数在类属性中查找信号并将它们复制到对象实例。我的测试程序证实了这一点。
从 PySide 导入 QtCore
class Klass(QtCore.QObject):
lst = []
sig = QtCore.Signal(str)
def main():
obj1 = Klass()
obj2 = Klass()
print "id: obj1.lst = {}, obj1.sig = {}".format(id(obj1.lst), id(obj1.sig))
print "id: obj2.lst = {}, obj2.sig = {}".format(id(obj2.lst), id(obj2.sig))
print "id: klass.lst = {}, klass.sig = {}".format(id(Klass.lst), id(Klass.sig))
if __name__ == '__main__':
main()
在我的输出中,您可以看到现在有三个信号对象,而对象和类的 lst-member 的 id 相同。
id: obj1.lst = 4317739344, obj1.sig = 4297560376
id: obj2.lst = 4317739344, obj2.sig = 4297560400
id: klass.lst = 4317739344, klass.sig = 4317851072
隐式创建对象属性只是令人困惑,因此风格不好(恕我直言)。也许他们确实有充分的理由,但我没有看到他们。所以我的问题是:他们为什么选择这个解决方案而不是仅仅在构造函数中将信号创建为常规属性?