"Невозможно установить атрибут" с свойствами нового стиля в 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 в определении класса, у него есть имя, которое вы действительно хотите использовать. Но так как это оставит ваше пространство имен классов загрязненным неполными версиями свойства, которое вы хотите использовать, лучше всего использовать одно и то же имя для их очистки.