Menu
CoddyTech

Повторение — менеджер банковского счёта

Часть раздела Объектно-ориентированное программирование путешествия по Python на Coddy. Урок 16 из 64.

challenge icon

Задание

Средне

Создай полный класс BankAccount, демонстрирующий концепции объектно-ориентированного программирования, включая переменные класса, приватные атрибуты, свойства, геттеры, сеттеры и методы. 

1. Создай класс BankAccount с:

  • Переменной класса interest_rate, заданной значением 0.02 (2%)
  • Приватными атрибутами экземпляра __owner_name и __balance
  • Конструктором, который инициализирует эти атрибуты

2. Реализуй геттеры и сеттеры свойств: 

  • Свойством только для чтения owner_name, которое возвращает имя владельца счёта
  • Свойством balance с:
    • Геттером, который возвращает текущий баланс
    • Сеттером, который проверяет пополнения (отклоняя отрицательные суммы)
    • Если проверка не пройдена, выведи: "Balance cannot be negative"

3. Реализуй методы:

  • deposit(amount), который:
    • Увеличивает баланс, если сумма положительна
    • Выводит "Deposit amount must be positive" и возвращает False, если сумма не положительна
    • Возвращает True в случае успеха
  • withdraw(amount), который:
    • Уменьшает баланс, если сумма положительна и средств достаточно
    • Выводит "Withdrawal amount must be positive" и возвращает False, если сумма не положительна
    • Выводит "Insufficient funds" и возвращает False, если сумма превышает баланс
    • Возвращает True в случае успеха
  • apply_interest(), который:
    • Начисляет проценты на баланс, исходя из процентной ставки класса
    • Возвращает сумму начисленных процентов
  • display_info(), который выводит сведения о счёте в следующем формате:

    Account Owner: [owner_name]
    Balance: $[balance]
    Interest Rate: [interest_rate]%

Требования к формату вывода

  • Все сообщения об ошибках проверки должны выводиться точно в указанном виде
  • Метод display_info() должен форматировать вывод точно так, как показано выше
  • Процентную ставку нужно выводить в виде процентов (умножить на 100)

Попробуйте сами

from bank_account import BankAccount

# Обработчик тестовых случаев
test_case = input()

if test_case == "account_creation":
    # Проверка создания счёта
    account = BankAccount("Alice", 1000)
    print(f"Owner: {account.owner_name}")
    print(f"Initial balance: ${account.balance}")
    print(f"Interest rate: {BankAccount.interest_rate * 100}%")

elif test_case == "deposit_method":
    # Проверка функции пополнения
    account = BankAccount("Bob", 500)
    print(f"Initial balance: ${account.balance}")
    
    # Допустимое пополнение
    result = account.deposit(300)
    print(f"Deposit result: {result}")
    print(f"New balance: ${account.balance}")
    
    # Недопустимое пополнение
    result = account.deposit(-50)
    print(f"Negative deposit result: {result}")
    print(f"Balance after invalid deposit: ${account.balance}")

elif test_case == "withdraw_method":
    # Проверка функции снятия средств
    account = BankAccount("Charlie", 1000)
    
    # Допустимое снятие средств
    result = account.withdraw(400)
    print(f"Withdrawal result: {result}")
    print(f"Balance after withdrawal: ${account.balance}")
    
    # Недопустимое снятие средств (отрицательная сумма)
    result = account.withdraw(-50)
    print(f"Negative withdrawal result: {result}")
    
    # Недопустимое снятие средств (сумма превышает остаток)
    result = account.withdraw(1000)
    print(f"Excessive withdrawal result: {result}")
    print(f"Final balance: ${account.balance}")

elif test_case == "property_access":
    # Проверка доступа к свойствам и их защиты
    account = BankAccount("Dave", 800)
    
    print(f"Owner via property: {account.owner_name}")
    print(f"Balance via property: ${account.balance}")
    
    # Попытка изменить баланс (должен использоваться сеттер)
    account.balance = 1200
    print(f"Balance after valid setter: ${account.balance}")
    
    # Попытка установить недопустимый баланс
    account.balance = -500
    print(f"Balance after invalid setter: ${account.balance}")
    
    # Попробовать получить прямой доступ к закрытым атрибутам (должно вызвать ошибку)
    try:
        print(account.__owner_name)
    except AttributeError:
        print("Cannot access private owner_name directly")

elif test_case == "apply_interest":
    # Проверить начисление процентов
    account = BankAccount("Eve", 2000)
    
    # Проверить исходный баланс
    print(f"Initial balance: ${account.balance}")
    
    # Начислить проценты
    interest_earned = account.apply_interest()
    expected_interest = 2000 * 0.02
    
    print(f"Interest earned: ${interest_earned}")
    print(f"New balance after interest: ${account.balance}")
    print(f"Interest calculation correct: {interest_earned == expected_interest}")

elif test_case == "display_info":
    # Проверить формат вывода метода display_info
    account = BankAccount("Frank", 1500)
    
    # Изменить процентную ставку, чтобы проверить переменную класса
    original_rate = BankAccount.interest_rate
    BankAccount.interest_rate = 0.03
    
    print("Display info output:")
    account.display_info()
    
    # Восстановить исходную ставку
    BankAccount.interest_rate = original_rate

elif test_case == "original_test_case":
    # Запустить исходный тестовый код из задания
    account = BankAccount("Coddy", 1000)

    # Выполнить операции
    account.deposit(500)
    account.withdraw(200)
    account.apply_interest()

    # Вывести информацию о счёте
    account.display_info()

    # Проверить валидацию в сеттере
    account.balance = 5000
    print(f"Balance after setter: ${account.balance}")

    # Проверить валидацию при снятии средств
    account.withdraw(10000)
    print(f"Final balance: ${account.balance}")

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Python