Что такое модификаторы доступа в Python?

Ответ

В Python, в отличие от некоторых других языков (например, Java или C++), нет строгих модификаторов доступа (public, protected, private) в классическом смысле. Вместо этого используются соглашения об именовании и механизм name mangling для управления видимостью атрибутов и методов класса.

Основные подходы:

  1. Публичные (Public):

    • Обозначение: Нет специальных префиксов.
    • Доступ: Доступны из любого места. Все атрибуты и методы по умолчанию публичные.
    • Назначение: Предназначены для внешнего использования и являются частью публичного API класса.
      class Example:
      def __init__(self):
          self.public_attr = 10  # Публичный атрибут
  2. Защищённые (Protected):

    • Обозначение: Префикс из одного подчёркивания (_).
    • Доступ: Технически доступны из любого места, но это соглашение для разработчиков. Сигнализирует, что атрибут/метод предназначен для внутреннего использования класса или его подклассов.
    • Назначение: Предотвращение случайного доступа или изменения извне, но не блокирует его.
      class Example:
      def __init__(self):
          self._protected_attr = 20  # Защищённый атрибут
  3. Приватные (Private):

    • Обозначение: Префикс из двух подчёркиваний (__).
    • Доступ: Доступны только внутри класса, где они определены. Python применяет механизм name mangling (искажение имени), преобразуя __attr в _ИмяКласса__attr. Это предотвращает конфликты имён в подклассах и затрудняет прямой доступ извне.
    • Назначение: Полностью инкапсулировать атрибут/метод, защищая его от случайного или намеренного изменения извне класса и его подклассов.
      class Example:
      def __init__(self):
          self.__private_attr = 30  # Приватный атрибут

Важно: Python не имеет механизмов, полностью запрещающих доступ к защищённым или "приватным" членам. Это скорее система рекомендаций и соглашений, которая помогает поддерживать инкапсуляцию и чистоту кода. Прямой доступ к _protected_attr или _Example__private_attr возможен, но считается плохой практикой и нарушает принципы инкапсуляции.