Как в Python работает доступ к ‘protected’ методам и атрибутам?

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

Ответ

В Python нет строгой инкапсуляции, как в Java или C++. 'Protected' члены класса (с одним префиксом-подчеркиванием, например, _my_method) — это соглашение, а не синтаксическое ограничение.

Это соглашение сигнализирует другим разработчикам: "Этот атрибут или метод является частью внутренней реализации класса и не предназначен для прямого использования извне. Его API может измениться в будущих версиях без предупреждения".

Технически вы можете получить к ним доступ напрямую, но это считается плохой практикой.

Пример

class Gadget:
    def __init__(self, name):
        self.name = name  # public атрибут
        self._serial_number = self._generate_serial()  # 'protected' атрибут

    def _generate_serial(self):
        # 'protected' метод для внутренней логики
        return f"SN-{hash(self.name)}"

    def get_info(self):
        # public метод, который использует 'protected' члены
        return f"Gadget: {self.name}, Serial: {self._serial_number}"

g = Gadget("MyPhone")

# Правильный способ использования
print(g.get_info())

# Технически возможно, но не рекомендуется
print(g._serial_number)          # Прямой доступ к атрибуту
print(g._generate_serial())      # Прямой вызов метода

Итог: Вы можете вызвать 'protected' метод, но не должны, так как это нарушает инкапсуляцию и делает ваш код хрупким и зависимым от внутренней реализации других классов.