Существует одна причина, не упомянутая вышеупомянутым.
можно украсить любой интерфейс легко java.lang.reflect. Прокси, разрешающий Вам добавить пользовательский код во времени выполнения к любому методу в данном интерфейсе. Это очень мощно.
См. http://tutorials.jenkov.com/java-reflection/dynamic-proxies.html для учебного руководства.
Добавьте имя переменной к __
и создать свойство только для чтения, 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
Простое доверие к пользователю не обязательно плохо; если вы просто пишете быструю программу Python, которую нужно использовать один раз и выбросить, вы вполне можете просто поверить, что пользователь не изменит поле pid.
ИМХО, самый питонический способ принудительного использования поля только для чтения - использовать свойство, которое вызывает исключение при попытке установить поле.
Итак, IMHO, у вас есть хорошие инстинкты в отношении этого материала.
Может быть, вы можете переопределить __ setattr __
? В строке
def __setattr__(self, name, value):
if self.__dict__.has_key(name):
raise TypeError, 'value is read only'
self.__dict__[name] = value
Просто используйте свойство и скрытый атрибут (с префиксом один подчеркивания).
Простые свойства доступны только для чтения!
>>> 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, ваше свойство доступно только для чтения, как и возвращаемое значение метода.