QObject导数中的变量访问怪异

时间:2012-04-20 13:37:30

标签: python qt4 python-3.x pyside

下面的代码应该打印相同的东西三次。为什么不呢?

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上的Python 3.2.2上编译PySide 1.1.1,但它无法解决问题。

1 个答案:

答案 0 :(得分:1)

我可以在Python 3.2.3 / PySide 1.1.0,Ubuntu 12.04上确认这一点。在同一个安装上使用PyQt4。

这是PySide中的一个错误。如果您尚未提交错误报告,则应提交错误报告。

如果我只稍微改变一下这个例子,那么这个例子甚至是段错误的:

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()