Ответ
В 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' метод, но не должны, так как это нарушает инкапсуляцию и делает ваш код хрупким и зависимым от внутренней реализации других классов.