← Все вопросы
Что значат подчёркивания _ и __ перед именем в Python?
18
Встречаю self._x с одним подчёркиванием и self.__x с двумя. Это про приватность? В чём разница и реально ли оно что-то запрещает?
3 ответа
27
✓ Принятый ответ — помог автору
В Python нет настоящих приватных полей, всё держится на договорённостях:
- Одно подчёркивание
_x— соглашение "это внутреннее, снаружи не трогай". Технически доступ остаётся, это просто вежливая просьба. - Два подчёркивания
__x— включается name mangling: Python переименовывает поле в_ИмяКласса__x. Доступ всё ещё возможен, но через настоящее имя. Главная цель — не "спрятать", а избежать случайного конфликта имён при наследовании.
class A:
def __init__(self):
self._internal = 1 # "не трогай, но я не запрещаю"
self.__private = 2 # станет _A__private
a = A()
print(a._internal) # 1 — работает
# print(a.__private) # AttributeError
print(a._A__private) # 2 — вот так всё ещё достанешь
Вывод: оба варианта не дают железной защиты, это про сигнал другим разработчикам, а не про безопасность.
10
_x — "это приватное, по-честному не лезь". __x — то же самое плюс защита от случайной перезаписи в наследниках (name mangling). Дандеры по краям (__init__) — отдельная история, это магические методы, их так не трогай.
Максим Герасимов важное уточнение про дандеры с двух сторон 👍 · 4 месяца назад
5
Одно — "не трогай", два — "совсем не трогай". Но запретить Python не может.
Ваш ответ
Войдите, чтобы ответить на вопрос.