Ответ
В Python инкапсуляция реализована на уровне соглашений, а не строгих ограничений. Доступ к "защищенным" и "приватным" членам класса возможен, но это считается нарушением принципов ООП.
1. Защищенные (protected) члены
Имена, начинающиеся с одного нижнего подчеркивания (_), по соглашению считаются внутренними. Интерпретатор никак не ограничивает доступ к ним.
Пример:
class MyClass:
def __init__(self):
self._protected_var = 10
def _protected_method(self):
return "This is a protected method."
obj = MyClass()
# Прямой доступ возможен, но не рекомендуется
print(obj._protected_var) # Вывод: 10
print(obj._protected_method()) # Вывод: This is a protected method.
Почему: Это сигнал другим разработчикам, что данный атрибут или метод не является частью публичного API и может измениться в будущем без предупреждения.
2. Приватные (private) члены
Имена, начинающиеся с двух нижних подчеркиваний (__), подвергаются механизму "искажения имен" (name mangling). Python автоматически изменяет имя атрибута, добавляя в начало имя класса: _ClassName__attributeName.
Пример:
class MyClass:
def __private_method(self):
return "This is a private method."
obj = MyClass()
# Прямой вызов вызовет AttributeError
# obj.__private_method()
# Доступ через искаженное имя
print(obj._MyClass__private_method()) # Вывод: This is a private method.
Почему: Механизм name mangling предназначен в первую очередь для предотвращения случайного переопределения методов в дочерних классах, а не для создания настоящей приватности.