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) # Доступ через искажённое имя, приватный формат
Ключевые мысли#
- Инкапсуляция снижает зависимость между модулями, разделяя внешние методы управления и скрытую внутреннюю логику.
- Объект выступает гарантом собственной стабильности, блокируя попытки внешнего кода установить некорректные или конфликтующие данные.
- Такой подход позволяет полностью переписывать внутреннее устройство класса без риска сломать программы, которые уже его используют.