Что пойдет не так, если я сохраню значение для 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.

Другие вопросы по тегам