Вы создали атрибут, который невозможно удалить :
>>> f = Foo2('bar')
>>> f.prop
'bar'
>>> f.prop = 'spam'
>>> f.prop
'spam'
>>> del f.prop
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't delete attribute
Сравните это с атрибутом Foo().prop
, который можно удалить:
>>> f = Foo('bar')
>>> f.prop
'bar'
>>> del f.prop
>>> f.prop
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute 'prop'
Помимо этого, или если вы добавили обработчик @prop.deleter
, создание такого свойства на самом деле не дает никаких преимуществ. Делегировать функции то, что может делать обычный доступ к атрибутам, не очень полезно.
Установщики свойств или получатели гораздо более полезны, когда они делают что-то в дополнение к просто для установки атрибута, например проверки или преобразования.
Например, установщик может принудительно установить, что значения всегда являются целыми числами, включая установку значения по умолчанию в случае сбоя преобразования в целое число:
@prop.setter
def prop(self, value):
try:
self._prop = int(prop)
except ValueError:
self._prop = 0
В других языках программирования, таких как Java, вы не можете легко преобразовать атрибуты в методы получения и установки (в Java нет эквивалента свойствам Python) без необходимости переписывать весь доступ к этим атрибутам в любом месте вашего кода. основа, поэтому на этих языках вы часто видите совет начать с геттеров и сеттеров. Это не относится к Python , вы можете тривиально превратить существующие атрибуты в свойства без необходимости изменения какого-либо кода с использованием этих атрибутов.