2017-01-20 5 views
0

Я использую python getters и seters, но мне не нравится использовать фиктивную переменную для хранения значения. Например, простой геттер и сеттер в питон может быть определена следующим образом:Что пойдет не так, если я сохраню значение для получателя и сеттера python в __dict__?

class Foo(object): 

    def get_bar(self): 
     print('getting bar') 
     return self._bar 

    def set_bar(self,variable): 
     print('setting bar') 
     self._bar = variable 

    bar = property(get_bar,set_bar) 

Что делает бар работы как обычный повседневном атрибут, за исключением того, что он выполняет оператор печати каждый раз, когда кто-то устанавливает или читает:

>>> my_fave_foo = Foo() 
>>> my_fave_foo.bar = 5 
setting bar 
>>> print(my_fave_foo.bar) 
getting bar 
5 

до, то есть, в будущем я решил использовать самоанализ, чтобы посмотреть на атрибуты моего любимого Foo:

>>> print(my_fave_foo.__dict__) 
{'_bar': 5} 

Это прослушивают меня, хотя я знаю, что Wa sn't действительно большая проблема, так что я сделал это вместо этого -

class Foo(object): 

    def get_bar(self): 
     print('getting bar') 
     return self.__dict__['bar'] 

    def set_bar(self,variable): 
     print('setting bar') 
     self.__dict__['bar'] = variable 

    bar = property(get_bar,set_bar) 

который имеет ожидаемое поведение

>>> my_fave_foo = Foo() 
>>> my_fave_foo.bar = 5 
setting bar 
>>> my_fave_foo.bar 
getting bar 
5 
>>> print(my_fave_foo.__dict__) 
{'bar': 5} 

Мой вопрос: почему это плохая идея? Другие люди, например, в ответ на этот вопрос:

What's the Pythonic way to use Getters and Setters?

Рекомендуют подчеркиванием конвенции. Я чувствую, что что-то не так с тем, что я сделал, но я не знаю, что это такое. Поэтому, пожалуйста, скажите мне, Что пойдет не так с этим?

Я быстро заметлю, что это пример игрушки, в моем фактическом коде есть настоящая причина использовать геттеры и сеттеры.

+1

Вы не можете использовать просто 'self.bar' без всякого этого геттера/сеттера? – furas

+2

Я бы точно не назвал мутацией класс в конструкторе «простым» примером ... –

+0

Ваш отступ немного отличается ... вы делаете 'setattr' внутри' __init__'? Обычно это делается один раз на уровне класса, а не на каждом экземпляре. – tdelaney

ответ

0

Я использую python getters и seters, но мне не нравится использовать фиктивную переменную для хранения значения.

Почему нет? Значение должно где-то жить, и оно логически является переменной экземпляра. У Python нет открытого/закрытого.

До, то есть, в будущем я решил использовать самоанализ, чтобы посмотреть на атрибуты моего любимого Foo:

Не делать то. We are all responsible users.

поэтому я [назвал переменную экземпляра той же, что и свойство]. почему это плохая идея?

Теперь вы полагаетесь на то, что свойство имеет преимущество перед элементом словаря, чтобы понять этот код. Если в элементе словаря и свойстве есть разные имена, тогда интригующему пользователю будет очевидно, что будет вызвано какое-то особое поведение.

Что пойдет не так с этим?

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

Если вы хотите, то можете использовать self.__bar для внутреннего состояния, которое управляет именем self._Foo__bar, что является защитой от конфликтов, вызванных подклассами. См. The Python Tutorial/Private Variables.

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