#python #properties
#python #свойства
Вопрос:
Я изучал декораторы @property, которые заменяют получатели и установщики. Многие люди, похоже, предпочитают использовать @property вместо getters и setters.
Независимо от того, что желательно, нужны ли они вообще в большинстве случаев? Я чувствую, что нет необходимости или излишне использовать @property для всех внутренних переменных, особенно когда переменные такие простые, как показано ниже. Не следует ли простые вещи оставлять простыми, если они работают?
class Ex():
def __init__(self, value):
self.__x = value
@property
def x(self):
return self.__x
@x.setter
def x(self, value):
self.__x = value
Я также не думаю, что @property обеспечивает дополнительную безопасность (если это вообще необходимо), поскольку люди с намерением все еще могут получить доступ к переменной. (._Ex__x)
Почему я должен использовать @property (когда проверка и будущие изменения не ожидаются) и когда я не должен их использовать?
Комментарии:
1. Да, определенно не используйте свойство здесь. Это бессмысленно. Свойства предоставляют вам инкапсуляцию без шаблона.
2. Если вам не нужна проверка или изменяемость, используйте
namedtuple
.3. @ThierryLathuille Спасибо. Я прочитал это перед публикацией вопроса, но мой вопрос, вероятно, хорошо обобщен с помощью «Независимо от того, что желательно, нужны ли они вообще в большинстве случаев?».
4. Связанный дубликат не задает тот же вопрос; он спрашивает, использовать ли свойства или методы получения / установки. В этом вопросе спрашивается, когда использовать свойства по сравнению с простыми переменными.
5. Обратите внимание, вам, вероятно, не следует использовать искажение имени с двойным подчеркиванием. Это для предотвращения столкновений в подклассах, а не для создания некоторого «частного». В Python нет закрытых переменных. Искажение имени с двойным подчеркиванием на самом деле не имеет ничего общего со свойствами
Ответ №1:
PEP 8, руководство по стилю для кода Python гласит:
Для простых общедоступных атрибутов данных лучше всего предоставлять только имя атрибута, без сложных методов доступа / мутирования.
Свойство без дополнительной логики, как вы показали, не дает никаких преимуществ по сравнению с использованием простого атрибута.