7

以下のコードは、同じものを3回出力することになっています。なぜそうではないのですか?

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のPython3.2.2でPySide1.1.1をコンパイルできましたが、問題は解決しません。

4

1 に答える 1

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()
于 2012-05-01T20:57:30.680 に答える