Постоянные переменные экземпляра?

Существует одна причина, не упомянутая вышеупомянутым.

можно украсить любой интерфейс легко java.lang.reflect. Прокси, разрешающий Вам добавить пользовательский код во времени выполнения к любому методу в данном интерфейсе. Это очень мощно.

См. http://tutorials.jenkov.com/java-reflection/dynamic-proxies.html для учебного руководства.

8
задан mikemaccana 9 June 2018 в 22:46
поделиться

4 ответа

Добавьте имя переменной к __ и создать свойство только для чтения, Python позаботится об исключениях, а сама переменная будет защищена от случайной перезаписи.

class foo(object):
    def __init__(self, bar):
        self.__bar = bar

    @property
    def bar(self):
        return self.__bar

f = foo('bar')
f.bar         # => bar
f.bar = 'baz' # AttributeError; would have to use f._foo__bar
8
ответ дан 5 December 2019 в 12:59
поделиться

Простое доверие к пользователю не обязательно плохо; если вы просто пишете быструю программу Python, которую нужно использовать один раз и выбросить, вы вполне можете просто поверить, что пользователь не изменит поле pid.

ИМХО, самый питонический способ принудительного использования поля только для чтения - использовать свойство, которое вызывает исключение при попытке установить поле.

Итак, IMHO, у вас есть хорошие инстинкты в отношении этого материала.

3
ответ дан 5 December 2019 в 12:59
поделиться

Может быть, вы можете переопределить __ setattr __ ? В строке

def __setattr__(self, name, value):
    if self.__dict__.has_key(name):
        raise TypeError, 'value is read only'
    self.__dict__[name] = value
1
ответ дан 5 December 2019 в 12:59
поделиться

Просто используйте свойство и скрытый атрибут (с префиксом один подчеркивания).

Простые свойства доступны только для чтения!

>>> class Test (object):
...  @property
...  def bar(self):
...   return self._bar
... 
>>> t = Test()
>>> t._bar = 2
>>> t.bar
2
>>> t.bar = 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute

Скрытие с двойным подчеркиванием не допускается используется, чтобы скрыть реализацию, но чтобы убедиться, что вы не столкнетесь с атрибутами подкласса; рассмотрим, например, миксин, он должен быть очень осторожным!

Если вы просто хотите скрыть атрибут, используйте одиночное подчеркивание. И, как вы видите, не нужно добавлять никакой дополнительной магии - если вы не определяете функцию set, ваше свойство доступно только для чтения, как и возвращаемое значение метода.

1
ответ дан 5 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: