1. ホーム
  2. python

[解決済み] Pythonの新スタイルのプロパティで「属性を設定できない」ことがある

2022-02-18 11:36:33

質問

新スタイルのプロパティ宣言を使おうとしています。

class C(object):
    def __init__(self):
        self._x = 0

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

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

if __name__ == '__main__':
    c = C()
    print c.x
    c.x = 10
    print c.x

と表示され、コンソールに以下のように表示されます。

pydev debugger: starting
getting
0
File "\test.py", line 55, in <module>
c.x = 10
AttributeError: can't set attribute

私は何を間違えているのでしょうか? 追伸:旧式の宣言でも問題なく動作します。

解決方法は?

ドキュメントには次のように書かれています。 のデコレーターフォームの使用について property :

追加関数には、必ず元のプロパティ(この場合はx)と同じ名前を付けてください。

を使用した場合、その理由は全く分かりません。 property を属性として返す関数として使用すると、メソッドを好きなように呼び出すことができます。

そこで、コードを以下のように変更する必要があります。

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