Как в Python получить доступ к защищенным и приватным методам класса

«Как в Python получить доступ к защищенным и приватным методам класса» — вопрос из категории ООП, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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 предназначен в первую очередь для предотвращения случайного переопределения методов в дочерних классах, а не для создания настоящей приватности.