Просто используйте свойство и скрытый атрибут (с префиксом one underscore).
Простые свойства доступны только для чтения!
>>> 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, ваше свойство доступно только для чтения, как и возвращаемое значение метода.