Как правило, код Python стремится придерживаться принципа Uniform Access .В частности, принятым подходом является:
- Отображение переменных вашего экземпляра напрямую, что позволяет, например,
foo.x = 0
, а не foo.set_x(0)
- Если вам нужно обернуть доступы внутри методовпо любой причине используйте
@property
, который сохраняет семантику доступа.Таким образом, foo.x = 0
теперь вызывает foo.set_x(0)
.
Основным преимуществом этого подхода является то, что вызывающий абонент может сделать это:
foo.x += 1
, даже если код можетдействительно надо делать:
foo.set_x(foo.get_x() + 1)
Первое утверждение бесконечно более читабельно.Тем не менее, с помощью свойств вы можете добавить (в начале или позже) управление доступом, которое вы получаете при втором подходе.
Обратите также внимание, что переменные экземпляра, начинающиеся с одного подчеркивания, обычно личное.То есть, подчеркивание сигнализирует другим разработчикам, что вы считаете значение частным, и им не следует связываться с ним напрямую;однако ничто в языке не мешает им напрямую связываться с ним.
Если вы используете двойное подчеркивание (например, __x
), Python немного запутывает имя.Однако переменная по-прежнему доступна извне класса через его запутанное имя.Это не совсем личное.Это просто ... более непрозрачно.И есть веские аргументы против использования двойного подчеркивания;с одной стороны, это может затруднить отладку.