/
mksmakarov
/
learn-python
Обзор
Документация
Войти
/
mksmakarov
/
learn-python
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
python-lang/object-oriented-programming/code/incapsulation.py
67 строк
3 KB
noir3cnt
[ADD] Incapsulation example
09 июн 2026, 14:19
09 июн 2026, 14:19
d91d61d
Код
Авторство
О чём код?
class BankAccount: """ Демонстрация инкапсуляции на примере банковского счета. Баланс является закрытым свойством, доступ к которому осуществляется только через публичные методы. """ def __init__(self, owner_name: str, initial_balance: float): # Публичное свойство - имя владельца self.owner = owner_name # Инкапсулированное (закрытое) свойство - баланс # Двойной прочерк вызывает искажение имени (__balance). # Это основная форма "приватности" в Python. self.__balance = initial_balance # --- Публичные методы (Интерфейс класса) --- def deposit(self, amount: float) -> None: """Метод для пополнения счета.""" if amount > 0: self.__balance += amount print(f"Пополнение на {amount}. Новый баланс: {self.get_balance()}") else: print("Сумма пополнения должна быть положительной.") def withdraw(self, amount: float) -> bool: """Метод для снятия средств со счета.""" if 0 < amount <= self.__balance: self.__balance -= amount print(f"Снятие {amount}. Новый баланс: {self.get_balance()}") return True else: print("Недостаточно средств или неверная сумма.") return False def get_balance(self) -> float: """Геттер (getter) - предоставляет безопасный способ узнать баланс.""" return self.__balance # --- Демонстрация работы --- if __name__ == "__main__": # Создаем экземпляр класса my_account = BankAccount("Алексей", 1000) # Доступ к публичному свойству print(f"Владелец счета: {my_account.owner}") # OK # Попытка прямого доступа к закрытому свойству вызовет ошибку try: print(my_account.__balance) except AttributeError as e: print(f"\nОшибка: {e}") # Python на самом деле переименовал атрибут, чтобы защитить его. # Объект содержит _ClassName__attribute print(f"Технически, атрибут доступен как: {my_account._BankAccount__balance}\n") # НО так делать категорически нельзя! Это нарушает принцип инкапсуляции. # Правильный доступ к балансу через геттер print(f"Текущий баланс (через геттер): {my_account.get_balance()}") # Использование публичных методов для изменения состояния my_account.deposit(500) my_account.withdraw(200) my_account.withdraw(2000) # Попытка снять больше, чем есть на счету