以下のコードは、同じものを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をコンパイルできましたが、問題は解決しません。