Вопрос-Ответ

Using @property versus getters and setters [duplicate]

Использование @property в сравнении с получателями и установщиками

Какие преимущества имеет @property нотация по сравнению с классическим методом получения + установки? В каких конкретных случаях программисту следует предпочесть одно другому?

Со свойствами:

class MyClass(object):
@property
def my_attr(self):
return self._my_attr

@my_attr.setter
def my_attr(self, value):
self._my_attr = value

Без свойств:

class MyClass(object):
def get_my_attr(self):
return self._my_attr

def set_my_attr(self, value):
self._my_attr = value
Переведено автоматически
Ответ 1

Предпочитаю свойства. Для этого они и существуют.

Причина в том, что в Python все атрибуты являются общедоступными. Имена, начинающиеся с подчеркивания или двух, - это просто предупреждение о том, что данный атрибут является деталью реализации, которая может измениться в будущих версиях кода. Это не мешает вам фактически получать или устанавливать этот атрибут. Следовательно, стандартный доступ к атрибутам - это обычный Pythonic способ доступа к атрибутам.

Преимущество свойств в том, что они синтаксически идентичны attribute access , поэтому вы можете переключаться с одного на другое без каких-либо изменений в клиентском коде. У вас даже может быть одна версия класса, которая использует свойства (скажем, для выполнения кода по контракту или отладки), и одна, которая не использует их для производства, без изменения кода, который их использует. В то же время вам не нужно писать геттеры и установщики для всего на случай, если вам может понадобиться лучше контролировать доступ позже.

Ответ 2

В Python вы не используете геттеры, сеттеры или свойства просто ради удовольствия. Сначала вы просто используете атрибуты, а затем, только при необходимости, в конечном итоге переходите к свойству без необходимости изменять код с помощью ваших классов.

Действительно, существует много кода с расширением .py, который использует получатели и установщики, наследование и бессмысленные классы везде, где, например, подошел бы простой кортеж, но это код людей, пишущих на C ++ или Java с использованием Python.

Это не код на Python.

Ответ 3

Использование properties позволяет начать с обычных обращений к атрибутам, а затем создавать резервные копии с помощью методов получения и настройки впоследствии по мере необходимости.

Ответ 4

Короткий ответ таков: свойства выигрывают без особых усилий. Всегда.

Иногда возникает необходимость в геттерах и установщиках, но даже тогда я бы "спрятал" их от внешнего мира. В Python есть множество способов сделать это (getattr, setattr, __getattribute__ и т.д. ..., Но очень краткий и чистый из них:

def set_email(self, value):
if '@' not in value:
raise Exception("This doesn't look like an email address.")
self._email = value

def get_email(self):
return self._email

email = property(get_email, set_email)

Вот краткая статья, которая знакомит с темой геттеров и установщиков в Python.

python