← Все вопросы

Что значат подчёркивания _ и __ перед именем в Python?

Задан 4 месяца назад921 просмотров3 ответа
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 не может.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект