Что пойдет не так, если я сохраню значение для getter и setter для python в __dict__?
Я использую методы получения и установки Python, но мне не нравится использовать фиктивную переменную для хранения значения. Например, простой метод получения и установки в python может быть определен так:
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}
Это беспокоило меня, хотя я знаю, что это не было большой проблемой, поэтому я сделал это вместо этого -
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}
Мой вопрос: почему это плохая идея? Другие люди, например, в ответ на этот вопрос:
Какой Pythonic способ использовать геттеры и сеттеры?
Рекомендую подчеркнуть подчеркивание У меня такое ощущение, что с тем, что я сделал, что-то не так, но я не знаю, что это такое. Поэтому, пожалуйста, скажите мне, что пойдет не так с этим?
Я быстро отмечу, что это игрушечный пример, в моем реальном коде есть реальная причина использовать геттеры и сеттеры.
1 ответ
Я использую методы получения и установки Python, но мне не нравится использовать фиктивную переменную для хранения значения.
Почему бы и нет? Значение должно где-то жить, и оно логически является переменной экземпляра. Python не имеет публичного / частного.
Пока будущее меня не решит использовать самоанализ для проверки атрибутов моего любимого Foo:
Тогда не делай этого. Мы все ответственные пользователи.
поэтому я [назвал переменную экземпляра так же, как свойство]. почему это плохая идея?
Теперь вы полагаетесь на тот факт, что свойство имеет приоритет над элементом словаря для понимания этого кода. Если элемент словаря и свойство имеют разные имена, то для интроспективного пользователя будет очевидно, что будет вызываться какое-то специальное поведение.
Что пойдет не так с этим?
Ваш код вводит в заблуждение и запутает вас при следующем просмотре.
Если вам нравится, вы можете использовать self.__bar
для внутреннего состояния, которое калечат название self._Foo__bar
, которая является защитой от столкновений, вызванных подклассами. Смотрите Python Tutorial / Private Variables.