🏠 Домашнее задание 38

Источник: Python Fundamentals 2025: Домашнее задание 38

⚡ Кратко

Выполните обязательную часть домашнего задания, проверьте код на нескольких входных данных и только затем переходите к дополнительным задачам.

Задание 1. Банковский счёт

Создайте класс BankAccount, описывающий банковский счёт.

  • Объект должен хранить имя владельца и текущий баланс.
  • Реализуйте методы: пополнение счёта, снятие средств, отображение баланса.
  • При попытке снять больше, чем есть на счёте, операция не должна выполняться.

Продумайте, какие поля и методы следует скрыть от внешнего доступа, а какие оставить открытыми.

Пример вывода:

Current balance: 150
Error: Amount must be positive.
Current balance: 150
Error: Not enough funds.
Current balance: 150

Задание 2. История операций

Доработайте класс BankAccount:

  • Каждая операция пополнения и снятия должна сохраняться в историю.
  • История должна быть доступна через property history только для чтения.
  • История представляется в виде списка строк ("Deposit: 150", "Withdraw: 100" и т.д.).

Пример вывода:

Current balance: 50
Operation history:
 Deposit: 150
 Withdraw: 100

Пример решения

class BankAccount:
    def __init__(self, owner: str, balance: float = 0) -> None:
        self.__owner = owner
        self.__balance = balance
        self.__history: list[str] = []

    def deposit(self, amount: float) -> None:
        if amount <= 0:
            print("Error: Amount must be positive.")
            return
        self.__balance += amount
        self.__history.append(f"Deposit: {amount}")

    def withdraw(self, amount: float) -> None:
        if amount <= 0:
            print("Error: Amount must be positive.")
            return
        if amount > self.__balance:
            print("Error: Not enough funds.")
            return
        self.__balance -= amount
        self.__history.append(f"Withdraw: {amount}")

    def show_balance(self) -> None:
        print(f"Current balance: {self.__balance}")

    @property
    def history(self) -> list[str]:
        return self.__history.copy()


account = BankAccount("Alice", 0)
account.deposit(150)
account.withdraw(-10)
account.withdraw(200)
account.withdraw(100)
account.show_balance()
print("Operation history:")
for operation in account.history:
    print(f" {operation}")

Что проверить в VS Code

  • Попытка изменить account._BankAccount__balance работает, но нарушает инкапсуляцию.
  • account.history возвращает список операций, но account.history = [] вызывает AttributeError.
  • История не изменяется, если операция отклонена.