一个QObject的派生物中访问变量出现奇怪问题

7
下面的代码应该会打印相同的内容三次。为什么没有呢?
from PySide.QtCore import QObject


class A(QObject):
    instance = 1

    @classmethod
    def test(cls):
        cls.instance  # Remove this line and it prints the right thing
        cls.instance = cls()
        print(cls.__dict__['instance'])
        print(cls.instance)
        print(type.__getattribute__(cls, 'instance'))

A.test()

期望的结果:

<__main__.A object at 0x1310c20>
<__main__.A object at 0x1310c20>
<__main__.A object at 0x1310c20>

实际结果:

<__main__.A object at 0x2242878>
1
1

QObject的元类甚至没有覆盖getattribute方法,那么为什么我用"cls.instance"却拿不到A实例呢?更奇怪的是,在赋值之前不访问该属性(请参见注释掉的代码行)就可以正常工作。我可以通过以下方式重现此问题(使用PySide 1.1.0):Windows 7 64位,Python 2.7.1 32位:正常工作;Windows 7 64位,Python 2.7.3 32位:正常工作;Windows 7 64位,Python 3.2.3 32位:失败;Ubuntu 11.10 64位,Python 2.7.2+:正常工作;Ubuntu 11.10 64位,Python 3.2.2:失败。更新:我成功在Ubuntu上编译了PySide 1.1.1和Python 3.2.2,但它并没有解决这个问题。

在 Windows 32 位系统上,使用 Python 2.7.3 和 PySide 1.1.0,我得到了预期的结果。 - reclosedev
Python 2.7.3 在 Ubuntu 12.04 上,PySide 和 PyQt4 都提供了预期的结果。 - pwuertz
Python 3,有人用吗?这似乎是问题的关键。 - Alex Grönholm
1个回答

1

我可以确认这个问题出现在Python 3.2.3 / PySide 1.1.0,Ubuntu 12.04上。在相同的安装中使用PyQt4是有效的。

这明显是PySide的一个bug。如果您还没有报告此问题,请提交一个bug报告。

如果我稍微改变一下示例,它甚至会崩溃:

from PySide.QtCore import *

class A(QObject):
    instance = []

    @classmethod
    def test(cls):
        print(cls.instance)
        cls.instance = cls()
        print(cls.__dict__['instance'])
        print("still ok")
        print(cls.instance)
        print("you won't see me")
        print(type.__getattribute__(cls, 'instance'))

A.test()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接