Ответ
Защищенные (protected) атрибуты и методы, именуемые с одним префиксным подчеркиванием (например, _my_var), используются в Python для обозначения того, что они являются частью внутренней реализации класса и не предназначены для прямого использования извне.
Это «джентльменское соглашение» между разработчиками, а не строгий запрет.
Основные цели использования:
- Обозначение внутреннего API. Показывает, что атрибут или метод используется для внутренних нужд класса. Его изменение или вызов извне может нарушить логику работы объекта.
- API для подклассов. Сигнализирует, что данный атрибут или метод может безопасно использоваться и переопределяться в дочерних классах, но не должен вызываться напрямую на экземплярах из внешнего кода.
Пример:
class Engine:
def _ignite(self):
# Внутренняя логика зажигания
print("Зажигание включено")
def start(self):
# Публичный метод, который использует защищенный
print("Запуск двигателя...")
self._ignite()
class TurboEngine(Engine):
def _ignite(self):
# Подкласс переопределяет защищенный метод
print("Включение турбо-зажигания")
super()._ignite()
# Корректное использование
engine = TurboEngine()
engine.start()
# Некорректное использование (хотя и возможно)
# engine._ignite() # Так делать не следует
Важно: Защита _protected атрибутов — это лишь соглашение, интерпретатор Python не блокирует к ним доступ. Для более строгой инкапсуляции (с «искажением имен») используются приватные атрибуты с двумя подчеркиваниями (__private_var).