История вопроса
В классическом объектно-ориентированном программировании инкапсуляция реализуется через ограничение доступа к внутренним данным. В большинстве языков есть строгие модификаторы доступа. В Python действует принцип "мы все взрослые люди" — строгой приватности нет.
Проблема
Разработчики путают защищённые (_protected) и приватные (__private) атрибуты и методы в Python, считают, что "двойное подчёркивание" обеспечивает полноценную защиту, либо считают, что защиты нет совсем.
Решение
Python реализует соглашения: одинарное подчёркивание _var — защищённый, двойное __var — приватный (имя подвергается манглингу). Доступ к такому атрибуту или методу возможен, но труднее: зовётся _ClassName__var.
Пример кода:
class Example: def __init__(self): self._protected = 1 # защищённый self.__private = 2 # приватный (name mangling) ex = Example() print(ex._protected) # 1 #print(ex.__private) # AttributeError print(ex._Example__private) # 2 (name mangling)
Ключевые особенности:
Можно ли через экземпляр получить доступ к "приватному" полю с двойным подчёркиванием?
Да, через манглинг: _ClassName__var. Так что данные доступны, просто неявно.
Как поведёт себя приватный метод/атрибут при наследовании?
Name mangling мешает наследникам случайно переопределить приватные элементы родителя, но доступ получить можно через _ParentClass__attr. Методы с двойным подчёркиванием не "видны" снаружи класса-наследника.
class A: def __foo(self): print("A") class B(A): def bar(self): # self.__foo() — ошибка self._A__foo() # работает
Есть ли в Python полная приватность уровня JVM/C++?
Нет. Всё основано на соглашениях и манглинге. Защитить данные полностью нельзя, ведь Python динамически позволяет обращаться к любым атрибутам.
В крупной библиотеке пользователь попытался сменить приватный атрибут через двойное подчёркивание, думая, что это "секрет" — но через _ClassName__var изменение всё равно случилось.
Плюсы:
Минусы:
В проекте договорились использовать одинарное подчёркивание для внутренних полей и не трогать их вне класса. Добавили property для безопасного доступа.
Плюсы:
Минусы: