Как в Python объявить защищенный (protected) метод класса

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

Ответ

В Python нет строгой концепции protected методов, как в языках вроде Java или C++. Вместо этого используется соглашение об именовании: имя метода или атрибута начинается с одного нижнего подчеркивания (_).

Это является сигналом для других разработчиков, что данный член класса предназначен для внутреннего использования (внутри самого класса и его наследников) и не является частью публичного API. Интерпретатор никак не ограничивает доступ к таким методам извне, полагаясь на дисциплину программиста.

Пример:

class Device:
    def __init__(self, ip_address):
        self._ip_address = ip_address  # Защищенный атрибут

    # Защищенный метод для внутренней логики
    def _connect(self):
        print(f"Внутреннее подключение к {self._ip_address}...")
        return True

    # Публичный метод, использующий защищенный
    def ping(self):
        if self._connect():
            print(f"Устройство {self._ip_address} доступно.")

class Router(Device):
    def reboot(self):
        print("Перезагрузка роутера.")
        # Корректное использование защищенного метода в наследнике
        if self._connect():
            print("Роутер успешно подключен для перезагрузки.")

my_router = Router("192.168.1.1")
my_router.ping()
my_router.reboot()

# Технически возможно, но является нарушением соглашения и плохой практикой
# my_router._connect()

Отличие от приватных методов (__)

  • Защищенный (_method): Соглашение. Доступен в классе и наследниках. Имя не изменяется.
  • Приватный (__method): Механизм искажения имен (name mangling). Интерпретатор изменяет имя на _ClassName__method, чтобы избежать случайных переопределений в наследниках. Это более сильный механизм сокрытия, но не абсолютная защита.

Таким образом, _ — это вежливая просьба "не трогать извне", а __ — технический механизм для предотвращения конфликтов имен.