2014-03-19 42 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有關。