我有一个名为Panel的类,它派生自PySide.QtGui.QWidget。我想跟踪我创建的面板数量。为此,我引入了一个名为count的类变量。类定义片段如下:
class Panel(QtGui.QWidget):
count = 0
def __init__(self, parent=None):
super(Panel, self).__init__(parent)
Panel.count += 1
print(Panel.count)
但是当我实例化新面板时,只打印一系列零。但我希望看到一个序列1 2 3 ...换句话说,Panel.count += 1
似乎被忽略而没有任何警告或错误。
当我对从普通Python的对象而不是QWidget派生的另一个类做同样的事情时,它按照预期的方式工作。
任何想法为什么会这样?
答案 0 :(得分: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
答案 1 :(得分:1)
只是一个有根据的猜测:通过重新分配class属性,可能会发生QT垃圾收集器中的一些奇怪行为。您观察到的行为可能与this issue有关。
答案 2 :(得分:0)
很可能这是PySide使用的Shiboken Python C ++绑定生成器的工件。这会将通常的元类type
替换为Shiboken.ObjectType
(以检查类型使用的元类print(Panel.__class__)
)。元数据可以在python中彻底改变类的行为,就像在这种情况下一样。
答案 3 :(得分:0)
问题是它有时会起作用,但有时候不行。 为了减轻这个问题,你可以使用全局变量,但这不是一个很好的解决方案。