Полезность декоратора свойств в python для изменяемых атрибутов - PullRequest
0 голосов
/ 15 июня 2019

Попытка понять преимущества свойств в Python, когда нам нужно установить их. Ясно, чтобы увидеть плюсы / минусы двух методов.

Каковы преимущества использования @property с @ prop.setter в Python:

class Foo2:

    def __init__(self, prop):
        self.prop = prop

    @property
    def prop(self):
        return self._prop

    @prop.setter
    def prop(self, value):
        self._prop = value

По сравнению с простой установкой атрибута без декоратора свойств?

class Foo:
    def __init__(self, prop):
        self.prop = prop

1 Ответ

2 голосов
/ 15 июня 2019

Вы создали атрибут, который невозможно удалить :

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...