Ответ
В 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, чтобы избежать случайных переопределений в наследниках. Это более сильный механизм сокрытия, но не абсолютная защита.
Таким образом, _ — это вежливая просьба "не трогать извне", а __ — технический механизм для предотвращения конфликтов имен.