Skip to content

Encapsulation

Определение#

Инкапсуляция (Encapsulation) — это принцип ООП, заключающийся в упаковке данных и методов для работы с ними внутри единого объекта с ограничением прямого доступа к его состоянию. Принцип Чёрного ящика.

Для чего?#

Инкапсуляция создаёт границы вокруг объекта. Она скрывает внутреннее устройство и позволяет объекту самому контролировать допустимые изменения своего состояния.

Во внешнем коде важно что делает объект, а не как именно он это делает.

Принцип чёрного ящика#

Инкапсуляцию превращает объект в Black Box (чёрный ящик), защищая его внутренности:

  • Скрытие реализации — извне доступен только публичный интерфейс объекта.
  • Контроль состояния — объект сам валидирует данные, прежде чем изменить свои атрибуты.
  • Независимость кода — внутреннюю логику можно переписать, не меняя код, который использует этот класс.

Извне взаимодейстие с объектом происходит через инструменты управления, не видя его внутреннего устройства.

Инкапсуляция в Python#

В отличие от языков с жёстким доступом, Python использует систему соглашений и декораторы:

  • _protected — соглашение «только для внутреннего пользования», доступ сохраняется.
  • __private — механизм искажения имен (Name Mangling) для защиты от случайной перезаписи.
  • @property — способ превратить методы в атрибуты, добавляя логику доступа без изменения интерфейса.
Формат Название Суть Доступ снаружи
name Публичный Обычный атрибут Разрешён
_protected Защищённый (Protected) Соглашение "не трогать" Можно, но не рекомендуется
__private Приватный (Private) Name Mangling Только через _Class__name

Через свойства @property можно выдавать «красивый» атрибут, пряча внутри проверки и логику.

Пример#

    class Robot:
        def __init__(self, model: str):
            self.model = model            # Публичный формат
            self._status = "active"       # Защищённый формат
            self.__core_id = "RX-99"      # Приватный формат

    bot = Robot("Wall-E")

    print(bot.model)           # Работает без ограничений

    print(bot._status)         # Работает, но висит соглашение "не трогать"

    print(bot.__core_id)       # Классический принт выдаст ошибку AttributeError
    print(bot._Robot__core_id) # Доступ через искажённое имя, приватный формат

Ключевые мысли#

  • Инкапсуляция снижает зависимость между модулями, разделяя внешние методы управления и скрытую внутреннюю логику.
  • Объект выступает гарантом собственной стабильности, блокируя попытки внешнего кода установить некорректные или конфликтующие данные.
  • Такой подход позволяет полностью переписывать внутреннее устройство класса без риска сломать программы, которые уже его используют.

Сопутствующие темы#