2015-07-20 2 views
1

У меня есть класс MyLib с переменной x. Я не использую эту переменную вне класса, но я устанавливаю ее из другого класса вне пакета. Я хотел бы знать, какой предпочтительный способ установить значение для переменной x ниже. Должен ли я установить его непосредственно, как показано в фрагменте кода ниже или Должен ли я создавать функции @property и @ x.setter для его установки.Использование @property против прямого доступа к переменным

class MyLib: 
    def __init__(self, *args, **kwargs) 
     self._x = None 
    def func_to_process_x(): 
     # do something 

class UseLib: 
    self._x = 'ABC' 

Примечание: этот вопрос касается не того, чтобы использовать свойства по геттеру и сеттерам. Скорее я хотел бы знать, целесообразно ли вообще использовать свойства/getter/setters, если мы можем напрямую использовать переменные, поскольку в Python ничего не является частным. Кроме того, рекомендуется использовать свойства, даже если я ничего не делаю в функции @x.setter, кроме просто присваивания значения переменной. В основном задается вопросом, стоит ли надбавка к свойствам во имя инкапсуляции (хотя это не инкапсуляция в чистом смысле, поскольку ничего не является частным. Пожалуйста, поправьте меня, если я ошибаюсь здесь)

+0

@ Rvdk. Спасибо за ссылку. Но этот вопрос больше говорит о свойствах против геттера и сеттера. Меня больше беспокоит доступ к переменной напрямую, а не использование свойств или getattr/setattr или любых других пользовательских getters/seters. – rdp

+0

Я все еще жду ответа на этот вопрос. Могут ли эксперты python внести свой вклад? – rdp

ответ

4

Это довольно просто: избегайте свойств как если они вам не нужны. Можно столкнуться следующий код от людей, которые только что перешли на Python от C++, C# или Java:

class C: 
    _x = None 

    @property 
    def x(self): 
     return self._x 

    @x.setter 
    def x(self, value): 
     self._x = value 

И самый первый вопрос: почему? Ради поиска «ООПиш»? Ничто не достигается выше код, то, что не может быть сделано с помощью:

class C: 
    x = None 

То есть красота свойств Python: можно поменять переменную версию свойств, без пользовательского API класс не зная об этом. Для этого могут быть любые причины, например. регистрация, проверка, бизнес-логика и т.д .:

class C: 
    ... 
    ... 
    @x.setter 
    def x(self, value): 
     self._x = value 
     log('x set to {}'.format(value)) 

В нижней строке: использовать переменные, переключиться на свойства, когда вам нужно перехватывать переменные считываются и/или письменной форме.

Смежные вопросы