Банковская система
Часть раздела Объектно-ориентированное программирование путешествия по Python на Coddy. Урок 62 из 64.
Задание
СложноВ этом задании ты создашь банковскую систему с несколькими типами счетов, транзакциями и центральным менеджером банка.
Реализуй банковскую систему, выполнив задания TODO в этих файлах:
transaction.py— класс Transaction для регистрации финансовых операцийaccount.py— абстрактный базовый класс Account с общей функциональностьюsavingsaccount.py— реализация SavingsAccount с начислением процентов и минимальным балансомcheckingaccount.py— реализация CheckingAccount с возможностью овердрафтаbank.py— класс Bank для управления счетами и переводами
Попробуйте сами
from transaction import Transaction
from account import Account
from savingsaccount import SavingsAccount
from checkingaccount import CheckingAccount
from bank import Bank
# Комплексная обработка тестовых случаев, охватывающая все сценарии и пограничные случаи
test_case = input()
if test_case == "transaction_class":
# Проверка класса Transaction
transaction = Transaction("deposit", 100.50, None)
print(str(transaction))
transaction = Transaction("withdrawal", 75.25, None)
print(str(transaction))
elif test_case == "account_deposit":
# Проверка функции внесения средств
savings = SavingsAccount("S123", "John Doe", 500)
# Положительная сумма
success, message = savings.deposit(200)
print(f"Success: {success}")
print(f"Message: {message}")
print(f"Balance: ${savings.get_balance():.2f}")
# Отрицательная сумма (операция должна завершиться неудачей)
success, message = savings.deposit(-50)
print(f"Success: {success}")
print(f"Message: {message}")
elif test_case == "savings_withdraw":
# Проверка снятия средств со сберегательного счёта
savings = SavingsAccount("S123", "John Doe", 500, min_balance=200)
# Допустимое снятие средств
success, message = savings.withdraw(100)
print(f"Success: {success}")
print(f"Message: {message}")
# Недопустимое снятие (остаток ниже минимального)
success, message = savings.withdraw(300)
print(f"Success: {success}")
print(f"Message: {message}")
# Отрицательная сумма
success, message = savings.withdraw(-50)
print(f"Success: {success}")
print(f"Message: {message}")
elif test_case == "checking_withdraw":
# Проверка снятия средств с текущего счёта
checking = CheckingAccount("C123", "Jane Smith", 300, overdraft_limit=200)
# Обычное снятие средств
success, message = checking.withdraw(100)
print(f"Success: {success}")
print(f"Message: {message}")
# Снятие средств с использованием овердрафта
success, message = checking.withdraw(300)
print(f"Success: {success}")
print(f"Message: {message}")
# Превышение лимита овердрафта
success, message = checking.withdraw(200)
print(f"Success: {success}")
print(f"Message: {message}")
elif test_case == "interest_application":
# Проверка начисления процентов
savings = SavingsAccount("S123", "John Doe", 1000, interest_rate=0.05)
success, message = savings.apply_interest()
print(f"Success: {success}")
print(f"Message: {message}")
print(f"New Balance: ${savings.get_balance():.2f}")
# Проверить историю транзакций
transactions = savings.get_transaction_history()
print(f"Transaction count: {len(transactions)}")
print(f"Last transaction: {transactions[-1]}")
elif test_case == "bank_create_account":
# Проверка создания банковского счёта
bank = Bank("Test Bank")
# Создать сберегательный счёт
success, message = bank.create_account("savings", "S123", "John Doe", 1000, interest_rate=0.03)
print(f"Success: {success}")
print(f"Message: {message}")
# Создать текущий счёт
success, message = bank.create_account("checking", "C456", "Jane Smith", 500, overdraft_limit=300)
print(f"Success: {success}")
print(f"Message: {message}")
# Попытка создать счёт с повторяющимся номером
success, message = bank.create_account("savings", "S123", "Another Person", 200)
print(f"Success: {success}")
print(f"Message: {message}")
# Попытка создать счёт с недопустимым типом
success, message = bank.create_account("invalid", "I789", "Test Person", 100)
print(f"Success: {success}")
print(f"Message: {message}")
elif test_case == "bank_transfer":
# Проверка функции банковского перевода
bank = Bank("Transfer Test Bank")
# Создать два счёта
bank.create_account("savings", "S123", "John Doe", 1000, min_balance=100)
bank.create_account("checking", "C456", "Jane Smith", 500)
# Допустимый перевод
success, message = bank.transfer("S123", "C456", 300)
print(f"Success: {success}")
print(f"Message: {message}")
print(f"Source balance: ${bank.get_account('S123').get_balance():.2f}")
print(f"Destination balance: ${bank.get_account('C456').get_balance():.2f}")
# Недопустимый перевод (нарушает требование к минимальному остатку)
success, message = bank.transfer("S123", "C456", 700)
print(f"Success: {success}")
print(f"Message: {message}")
# Недействительный счёт
success, message = bank.transfer("NONEXISTENT", "C456", 100)
print(f"Success: {success}")
print(f"Message: {message}")
elif test_case == "full_banking_workflow":
# Проверить полный цикл операций
bank = Bank("Full Workflow Bank")
# Создать счета
bank.create_account("savings", "S123", "John Doe", 1000, interest_rate=0.05, min_balance=200)
bank.create_account("checking", "C456", "Jane Smith", 500, overdraft_limit=250)
# Внести средства на счета
savings = bank.get_account("S123")
checking = bank.get_account("C456")
savings.deposit(300)
checking.deposit(200)
# Выполнить перевод
bank.transfer("S123", "C456", 400)
# Начислить проценты на сберегательный счёт
savings.apply_interest()
# Снять средства с текущего счёта с использованием овердрафта
checking.withdraw(900)
# Вывести итоговое состояние
print("Final Account States:")
print(f"Savings (S123): ${savings.get_balance():.2f}")
print(f"Checking (C456): ${checking.get_balance():.2f}")
print("\nTransaction History (Savings):")
for transaction in savings.get_transaction_history():
print(f"- {transaction}")
print("\nTransaction History (Checking):")
for transaction in checking.get_transaction_history():
print(f"- {transaction}")
elif test_case == "inheritance_validation_test":
# Всесторонняя проверка наследования
objects = []
if 'Transaction' in locals():
objects.append(Transaction('test_param', 100, None))
if 'SavingsAccount' in locals():
objects.append(SavingsAccount('test_param', 'Test User'))
if 'CheckingAccount' in locals():
objects.append(CheckingAccount('test_param', 'Test User'))
if 'Bank' in locals():
objects.append(Bank('test_param'))
for obj in objects:
print(f'{type(obj).__name__}:')
print(f' MRO: {[cls.__name__ for cls in type(obj).__mro__]}')
print()
elif test_case == "method_overriding_test":
# Проверить поведение переопределённых методов
print('Testing method overriding...')
# Создать экземпляры и проверить переопределённые методы
if 'SavingsAccount' in locals():
obj = SavingsAccount('test', 'Test User')
print(f'SavingsAccount methods work correctly')
if 'CheckingAccount' in locals():
obj = CheckingAccount('test', 'Test User')
print(f'CheckingAccount methods work correctly')
elif test_case == "attribute_access_test":
# Проверить доступ к атрибутам
print('Testing attribute access...')
if 'Transaction' in locals():
obj = Transaction('test', 100, None)
print(f'Transaction attributes accessible')
if 'SavingsAccount' in locals():
obj = SavingsAccount('test', 'Test User')
print(f'SavingsAccount attributes accessible')
if 'CheckingAccount' in locals():
obj = CheckingAccount('test', 'Test User')
print(f'CheckingAccount attributes accessible')
if 'Bank' in locals():
obj = Bank('test')
print(f'Bank attributes accessible')
elif test_case == "boundary_conditions_test":
# Проверка граничных условий и крайних значений
print('Running boundary_conditions_test test...')
print('Test completed successfully')
elif test_case == "error_handling_test":
# Проверка обработки ошибок и исключительных ситуаций
print('Running error_handling_test test...')
print('Test completed successfully')
elif test_case == "polymorphic_behavior_test":
# Проверка полиморфного поведения с объектами разных типов
print('Running polymorphic_behavior_test test...')
print('Test completed successfully')
elif test_case == "stress_test":
# Нагрузочное тестирование с множеством объектов
import time
start_time = time.time()
objects = []
for i in range(50):
try:
objects.append(Transaction(f'test_{i}', 100, None))
except:
pass # Корректно обрабатывать ошибки создания
try:
objects.append(SavingsAccount(f'test_{i}', f'User_{i}'))
except:
pass # Корректно обрабатывать ошибки создания
try:
objects.append(CheckingAccount(f'test_{i}', f'User_{i}'))
except:
pass # Корректно обрабатывать ошибки создания
try:
objects.append(Bank(f'test_{i}'))
except:
pass # Корректно обрабатывать ошибки создания
end_time = time.time()
print(f'Created {len(objects)} objects')
print(f'Time taken: {end_time - start_time:.4f} seconds')
print('Stress test completed')
elif test_case == "comprehensive_validation":
# Комплексная проверка корректности
print('=== Comprehensive Validation Test ===')
# Тест 1: Создание базовых объектов
print('1. Basic Object Creation:')
success_count = 0
classes = ['Transaction', 'SavingsAccount', 'CheckingAccount', 'Bank']
try:
obj = Transaction('test', 100, None)
success_count += 1
print(f' Transaction: Created successfully')
except Exception as e:
print(f' Transaction: Creation failed - {e}')
try:
obj = SavingsAccount('test', 'Test User')
success_count += 1
print(f' SavingsAccount: Created successfully')
except Exception as e:
print(f' SavingsAccount: Creation failed - {e}')
try:
obj = CheckingAccount('test', 'Test User')
success_count += 1
print(f' CheckingAccount: Created successfully')
except Exception as e:
print(f' CheckingAccount: Creation failed - {e}')
try:
obj = Bank('test')
success_count += 1
print(f' Bank: Created successfully')
except Exception as e:
print(f' Bank: Creation failed - {e}')
print(f' Successfully created {success_count}/{len(classes)} classes')
print('=== Validation Complete ===')Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Введение в ООПВнешние файлыКлассы и объектыПараметр selfМетодыАтрибутыМетод-конструктор (__init__)Повторение — простой калькулятор4Наследование
Основы наследованияФункция super()Переопределение методовМножественное наследованиеПорядок разрешения методовПовторение: иерархия сотрудников7Специальные методы
Введение в магические методыПерегрузка операторовМагические методы контейнеровПовторение — пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»13Заключительные задания
Платформа электронного обученияБанковская системаРазработка персонажа игрыСервис аренды автомобилей2Декораторы
Введение в декораторыДекоратор свойстваДекоратор статического методаДекоратор метода класса5Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур8Продвинутые концепции ООП
Композиция и наследованиеМиксиныСтатические методы и методы классаДекораторы классовМенеджеры контекста11Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»3Свойства классов
Переменные экземпляра и классаДекораторы свойствПриватные атрибутыПовторение — менеджер банковского счёта6Инкапсуляция
Публичные, защищённые и приватные членыМодификаторы доступаСокрытие информацииПродвинутые декораторы свойствПовторение — система учёта студентов12Проект: Система управления библиотекой
Обзор проектаКлассы книг и пользователейСистема выдачи книгФункция поискаИнтерфейс администратораТестирование и интеграцияПотренируйтесь самостоятельно: Онлайн-компилятор Python