← Назад к вопросам

Что такое protected метод?

2.0 Middle🔥 141 комментариев
#Python Core#Soft Skills

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Protected методы в Python

Protected метод — это метод класса, предназначенный для использования внутри класса и его подклассов. В Python это обозначается одним подчёркиванием в начале имени.

Основное определение

class Animal:
    def __init__(self, name):
        self.name = name
    
    def _move(self):
        """Protected метод"""
        print(f"{self.name} движется")
    
    def public_action(self):
        """Публичный метод"""
        self._move()  # Можно вызвать внутри класса

Три уровня доступа

1. Public (публичный):

class Car:
    def drive(self):
        pass

car = Car()
car.drive()  # ОК - доступен везде

2. Protected (защищённый) — _method:

class Vehicle:
    def _start_engine(self):
        pass

class Car(Vehicle):
    def drive(self):
        self._start_engine()  # ОК в подклассе

car = Car()
car._start_engine()  # Технически работает, но не рекомендуется

3. Private (приватный) — __method:

class Secret:
    def __hide(self):
        pass
    
    def public(self):
        self.__hide()  # ОК

s = Secret()
s.__hide()  # Error - недоступно

Переопределение в подклассах

class Shape:
    def area(self):
        return self._calculate_area()
    
    def _calculate_area(self):
        raise NotImplementedError

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    
    def _calculate_area(self):
        return 3.14 * self.radius ** 2

circle = Circle(5)
print(circle.area())  # 78.5

Лучшие практики

  • Используй _method для методов, не входящих в публичный API
  • Protected методы часть контракта для подклассов
  • Избегай глубокой иерархии с protected методами
  • Тестируй protected методы отдельно
  • Документируй, когда можно переопределять

Protected методы — это соглашение Python, основанное на доверии разработчикам, что они будут уважать инкапсуляцию и не вызывать методы, начинающиеся с подчёркивания, из внешнего кода.