2014-03-19 69 views
4

我有一个名为Panel的类,它是派生自PySide.QtGui.QWidget。我想跟踪我创建的面板数量。为了实现这个,我引入了一个名为count的类变量。类定义片断如下:PySide - 类变量不能修改

​​

但是当我实例新板,只打印一个零序列。但我期望看到一个序列1 2 3 ...换句话说,Panel.count += 1似乎被忽略,没有任何警告或错误。

当我对另一个派生自普通Python对象而不是QWidget的类进行相同处理时,它的工作方式与预期相同。

任何想法是为什么?

+0

代码片段被编辑:自我缺失作为第一个__init__参数。感谢ekhumoro注意。 –

回答

0

很可能这是PySide使用的Shiboken Python C++绑定生成器的工件。这用Shiboken.ObjectType替换通常的元类type(检查您的类型的元类使用print(Panel.__class__))。元类可以彻底改变python中类的行为,就像它在这种情况下一样。

1

这将是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 
+0

我也更正了缺失的'self'进行测试,但也得到0,因为OP(使用PySide-1.2.1和Python 3.3) – Joe

+1

更正,1.1.2 – Joe

+0

用1.2.1重新检查,它仍然存在。虽然 – Joe

0

的问题是有时它的工作原理,但有时不是。 为了缓解这个问题,你可以使用全局变量,但这不是一个好的解决方案。

1

只是一个受过教育的猜测:通过重新分配类属性,QT的垃圾收集器中可能会出现一些奇怪的行为。您观察到的行为可能与this issue有关。