"Невозможно установить атрибут" с свойствами нового стиля в Python

Я пытаюсь использовать объявление свойств нового стиля:

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

что я делаю неправильно? P.S.: Декларация старого стиля отлично работает.

Ответ 1

В документации сказано следующее об использовании формы декоратора property:

Обязательно укажите дополнительные функции с тем же именем, что и исходное свойство (x в этом случае.)

Я понятия не имею, почему это происходит, если вы используете property как функцию для возврата атрибута, методы могут быть вызваны как угодно.

Итак, вам нужно изменить свой код на следующее:

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

Ответ 2

Метод установки должен иметь то же имя, что и получатель. Не волнуйтесь, декоратор знает, как рассказать им обособленно.

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

Ответ 3

Когда вы вызываете @x.setter, @x.getter или @x.deleter, вы создаете новый объект свойства и даете ему имя функции, которую вы украшаете. Так что действительно важно, что в последний раз, когда вы используете декоратор @x. * Er в определении класса, у него есть имя, которое вы действительно хотите использовать. Но так как это оставит ваше пространство имен классов загрязненным неполными версиями свойства, которое вы хотите использовать, лучше всего использовать одно и то же имя для их очистки.