我有一个名为Panel的类,它是派生自PySide.QtGui.QWidget。我想跟踪我创建的面板数量。为了实现这个,我引入了一个名为count的类变量。类定义片断如下:PySide - 类变量不能修改
但是当我实例新板,只打印一个零序列。但我期望看到一个序列1 2 3 ...换句话说,Panel.count += 1
似乎被忽略,没有任何警告或错误。
当我对另一个派生自普通Python对象而不是QWidget的类进行相同处理时,它的工作方式与预期相同。
任何想法是为什么?
我有一个名为Panel的类,它是派生自PySide.QtGui.QWidget。我想跟踪我创建的面板数量。为了实现这个,我引入了一个名为count的类变量。类定义片断如下:PySide - 类变量不能修改
但是当我实例新板,只打印一个零序列。但我期望看到一个序列1 2 3 ...换句话说,Panel.count += 1
似乎被忽略,没有任何警告或错误。
当我对另一个派生自普通Python对象而不是QWidget的类进行相同处理时,它的工作方式与预期相同。
任何想法是为什么?
很可能这是PySide使用的Shiboken Python C++绑定生成器的工件。这用Shiboken.ObjectType
替换通常的元类type
(检查您的类型的元类使用print(Panel.__class__)
)。元类可以彻底改变python中类的行为,就像它在这种情况下一样。
这将是PySide中的一个错误,如果这没有奏效。
这里是我所得到的,当我运行PySide-1.2.1代码(略有修正,因为有一个失踪self
参数):
>>> from PySide import QtGui
>>> app = QtGui.QApplication([])
>>> class Panel(QtGui.QWidget):
... count = 0
... def __init__(self, parent=None):
... super(Panel, self).__init__(parent)
... Panel.count += 1
... print(Panel.count)
...
>>> p1 = Panel()
1
>>> p2 = Panel()
2
>>> p3 = Panel()
3
>>> Panel.count
3
的问题是有时它的工作原理,但有时不是。 为了缓解这个问题,你可以使用全局变量,但这不是一个好的解决方案。
只是一个受过教育的猜测:通过重新分配类属性,QT的垃圾收集器中可能会出现一些奇怪的行为。您观察到的行为可能与this issue有关。
代码片段被编辑:自我缺失作为第一个__init__参数。感谢ekhumoro注意。 –