Python の @foo.setter が動作しないのはなぜですか? 質問する

Python の @foo.setter が動作しないのはなぜですか? 質問する

Python 2.6 でデコレータをいじっているのですが、うまく動作しないという問題があります。これが私のクラス ファイルです:

class testDec:

    @property
    def x(self): 
        print 'called getter'
        return self._x

    @x.setter
    def x(self, value): 
        print 'called setter'
        self._x = value

これは、プロパティのように扱いxながら、get と set でこれらの関数を呼び出すという意味だと私は考えました。そこで、IDLE を起動して確認しました。

>>> from testDec import testDec
from testDec import testDec
>>> t = testDec()
t = testDec()
>>> t.x
t.x
called getter
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "testDec.py", line 18, in x
    return self._x
AttributeError: testDec instance has no attribute '_x'
>>> t.x = 5
t.x = 5
>>> t.x
t.x
5

明らかに最初の呼び出しは期待どおりに動作します。ゲッターを呼び出し、デフォルト値がないため失敗します。わかりました。ただし、assign の呼び出しによってt.x = 5新しいプロパティが作成されるようですxが、今度はゲッターが動作しません。

何が足りないのでしょうか?

ベストアンサー1

使用しているようです古典的な昔ながらのクラスPython 2では、プロパティ正しく動作させるには新しいスタイルの授業代わりに(Python 2では継承するobject) クラスを次のように宣言するだけですMyClass(object):

class testDec(object):

    @property
    def x(self): 
        print 'called getter'
        return self._x

    @x.setter
    def x(self, value): 
        print 'called setter'
        self._x = value

それは動作します:

>>> k = testDec()
>>> k.x
called getter
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/devel/class_test.py", line 6, in x
    return self._x
AttributeError: 'testDec' object has no attribute '_x'
>>> k.x = 5
called setter
>>> k.x
called getter
5
>>> 

問題を引き起こす可能性があるもう 1 つの詳細は、プロパティが機能するためには両方の方法で同じ名前が必要であることです。このように別の名前でセッターを定義すると動作しません:

@x.setter
def x_setter(self, value):
    ...

そして、最初は完全に簡単には見分けられないもう一つのことは、順序です。ゲッター最初に定義する必要がある最初にセッターを定義すると、name 'x' is not definedエラーが発生します。

おすすめ記事