python когда я не должен использовать свойства

#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 гласит:

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

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