Инкапсуляция — это принцип объектно ориентированного программирования, который скрывает внутреннее устройство объекта от внешнего мира. Простыми словами, объект работает как чёрный ящик: известно, что он делает, при этом нет понимания, каково его внутреннее устройство.
В повседневной жизни инкапсуляция встречается постоянно. При нажатии кнопки включения на телевизоре никто не задумывается, как ток подаётся на экран и какие процессы запускаются внутри. Известно, что кнопка включает телевизор, — и этого достаточно.
В программировании инкапсуляция работает так же: объект предоставляет пользователю понятный интерфейс или методы взаимодействия, а внутренняя логика и данные остаются скрытыми. Это защищает данные от случайных или намеренных изменений извне.
Тему инкапсуляции изучают на курсе «Python-разработчик». На нём вы за 10 месяцев освоите IT‑профессию с нуля, получите реальный опыт и навыки, которые нужны работодателям.
Без инкапсуляции код становится хрупким. Любое изменение внутри одного класса может сломать десятки других мест, где этот класс используется. Инкапсуляция делает программу более устойчивой к изменениям и упрощает её поддержку.
В Python инкапсуляция реализуется с помощью специальных методов. Есть три уровня доступа, которые определяют, кто может видеть и изменять данные.
class BankAccount:
def __init__(self, name, balance, pin):
self.name = name # публичный
self._balance = balance # защищённый
self.__pin = pin # приватный
def _check_pin(self, pin):
"""Вспомогательный метод проверки PIN-кода."""
if not self.__pin == pin:
raise PermissionError("Неверный PIN-код")
def deposit(self, amount):
"""Пополнение. Проверка PIN-кода не требуется."""
if amount <= 0:
raise ValueError("Сумма пополнения должна быть больше 0")
self._balance += amount
def withdraw(self, amount, pin):
"""Снятие денег. Защищено проверкой PIN-кода."""
self._check_pin(pin)
if amount <= 0:
raise ValueError("Сумма снятия должна быть больше 0")
if amount > self._balance:
raise ValueError("Недостаточно средств на счёте")
self._balance -= amount
def get_balance(self, pin):
"""Проверка баланса. Защищено проверкой PIN-кода."""
self._check_pin(pin)
return self._balance
if __name__ == "__main__":
# Создаём счет для пользователя с начальным депозитом 1000 и ПИН-кодом 1234
karpov_account = BankAccount("Max Karpov", 1000, "1234")
karpov_account.deposit(500) # баланс: 1500 (PIN не нужен)
print(karpov_account.get_balance("1234")) # 1500
print(karpov_account.get_balance("0000")) # Исключение: "Неверный PIN-код"
karpov_account.withdraw(200, "1234") # снятие: 1300
karpov_account.withdraw(10000, "0000") # Исключение: "Неверный PIN-код
# Исключение: "Недостаточно средств на счёте"
karpov_account.withdraw(10000, "1234")
# Исключение: "Сумма снятия должна быть больше 0"
karpov_account.withdraw(0, "1234")
print(karpov_account.get_balance("1234")) # баланс: 1300
Здесь атрибут balance защищён — его нельзя изменить напрямую, только через методы deposit и withdraw. В методах есть проверки: нельзя пополнить на ноль или отрицательную сумму и нельзя снять ноль или больше, чем есть на счёте. ПИН-код скрыт — его нельзя прочитать или изменить извне. Дополнительно есть защищённый вспомогательный метод проверки ПИН-кода.
Тему инкапсуляции изучают на курсе «Python-разработчик». На нём вы за 10 месяцев освоите IT‑профессию с нуля, получите реальный опыт и навыки, которые нужны работодателям.
Читать также: