我有一個名爲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注意。 –