Я использую 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?
Рекомендуют подчеркиванием конвенции. Я чувствую, что что-то не так с тем, что я сделал, но я не знаю, что это такое. Поэтому, пожалуйста, скажите мне, Что пойдет не так с этим?
Я быстро заметлю, что это пример игрушки, в моем фактическом коде есть настоящая причина использовать геттеры и сеттеры.
Вы не можете использовать просто 'self.bar' без всякого этого геттера/сеттера? – furas
Я бы точно не назвал мутацией класс в конструкторе «простым» примером ... –
Ваш отступ немного отличается ... вы делаете 'setattr' внутри' __init__'? Обычно это делается один раз на уровне класса, а не на каждом экземпляре. – tdelaney