Hệ thống ngân hàng
Thuộc phần Lập trình hướng đối tượng trong hành trình Python của Coddy. Bài học 62 trên 64.
Thử thách
KhóTrong thử thách này, bạn sẽ xây dựng một hệ thống ngân hàng với nhiều loại tài khoản, giao dịch và một bộ phận quản lý ngân hàng trung tâm.
Hoàn thiện hệ thống ngân hàng bằng cách thực hiện các mục TODO trong những tệp sau:
transaction.py- Lớp Transaction dùng để ghi lại các hoạt động tài chínhaccount.py- Lớp Account cơ sở trừu tượng với các chức năng chungsavingsaccount.py- Phần triển khai SavingsAccount với lãi suất và số dư tối thiểucheckingaccount.py- Phần triển khai CheckingAccount với khả năng thấu chibank.py- Lớp Bank dùng để quản lý tài khoản và chuyển khoản
Tự làm thử
from transaction import Transaction
from account import Account
from savingsaccount import SavingsAccount
from checkingaccount import CheckingAccount
from bank import Bank
# Xử lý toàn diện các test case, bao gồm mọi tình huống và trường hợp biên
test_case = input()
if test_case == "transaction_class":
# Kiểm tra lớp Transaction
transaction = Transaction("deposit", 100.50, None)
print(str(transaction))
transaction = Transaction("withdrawal", 75.25, None)
print(str(transaction))
elif test_case == "account_deposit":
# Kiểm tra chức năng gửi tiền
savings = SavingsAccount("S123", "John Doe", 500)
# Số tiền dương
success, message = savings.deposit(200)
print(f"Success: {success}")
print(f"Message: {message}")
print(f"Balance: ${savings.get_balance():.2f}")
# Số tiền âm (thao tác sẽ thất bại)
success, message = savings.deposit(-50)
print(f"Success: {success}")
print(f"Message: {message}")
elif test_case == "savings_withdraw":
# Kiểm tra việc rút tiền từ tài khoản tiết kiệm
savings = SavingsAccount("S123", "John Doe", 500, min_balance=200)
# Rút tiền hợp lệ
success, message = savings.withdraw(100)
print(f"Success: {success}")
print(f"Message: {message}")
# Không hợp lệ (số dư thấp hơn mức tối thiểu)
success, message = savings.withdraw(300)
print(f"Success: {success}")
print(f"Message: {message}")
# Số tiền âm
success, message = savings.withdraw(-50)
print(f"Success: {success}")
print(f"Message: {message}")
elif test_case == "checking_withdraw":
# Kiểm tra việc rút tiền từ tài khoản thanh toán
checking = CheckingAccount("C123", "Jane Smith", 300, overdraft_limit=200)
# Rút tiền thông thường
success, message = checking.withdraw(100)
print(f"Success: {success}")
print(f"Message: {message}")
# Rút tiền bằng hạn mức thấu chi
success, message = checking.withdraw(300)
print(f"Success: {success}")
print(f"Message: {message}")
# Vượt quá hạn mức thấu chi
success, message = checking.withdraw(200)
print(f"Success: {success}")
print(f"Message: {message}")
elif test_case == "interest_application":
# Kiểm tra việc tính lãi
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}")
# Kiểm tra lịch sử giao dịch
transactions = savings.get_transaction_history()
print(f"Transaction count: {len(transactions)}")
print(f"Last transaction: {transactions[-1]}")
elif test_case == "bank_create_account":
# Kiểm tra việc tạo tài khoản ngân hàng
bank = Bank("Test Bank")
# Tạo tài khoản tiết kiệm
success, message = bank.create_account("savings", "S123", "John Doe", 1000, interest_rate=0.03)
print(f"Success: {success}")
print(f"Message: {message}")
# Tạo tài khoản thanh toán
success, message = bank.create_account("checking", "C456", "Jane Smith", 500, overdraft_limit=300)
print(f"Success: {success}")
print(f"Message: {message}")
# Tạo tài khoản với số tài khoản trùng lặp
success, message = bank.create_account("savings", "S123", "Another Person", 200)
print(f"Success: {success}")
print(f"Message: {message}")
# Tạo tài khoản với loại không hợp lệ
success, message = bank.create_account("invalid", "I789", "Test Person", 100)
print(f"Success: {success}")
print(f"Message: {message}")
elif test_case == "bank_transfer":
# Kiểm tra chức năng chuyển khoản ngân hàng
bank = Bank("Transfer Test Bank")
# Tạo hai tài khoản
bank.create_account("savings", "S123", "John Doe", 1000, min_balance=100)
bank.create_account("checking", "C456", "Jane Smith", 500)
# Chuyển khoản hợp lệ
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}")
# Chuyển khoản không hợp lệ (vượt quá số dư tối thiểu)
success, message = bank.transfer("S123", "C456", 700)
print(f"Success: {success}")
print(f"Message: {message}")
# Tài khoản không hợp lệ
success, message = bank.transfer("NONEXISTENT", "C456", 100)
print(f"Success: {success}")
print(f"Message: {message}")
elif test_case == "full_banking_workflow":
# Kiểm tra toàn bộ quy trình
bank = Bank("Full Workflow Bank")
# Tạo tài khoản
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)
# Nạp tiền vào tài khoản
savings = bank.get_account("S123")
checking = bank.get_account("C456")
savings.deposit(300)
checking.deposit(200)
# Chuyển tiền
bank.transfer("S123", "C456", 400)
# Tính lãi cho tài khoản tiết kiệm
savings.apply_interest()
# Rút tiền từ tài khoản thanh toán bằng hạn mức thấu chi
checking.withdraw(900)
# In ra trạng thái cuối cùng
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":
# Kiểm tra toàn diện tính kế thừa
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":
# Kiểm tra cách hoạt động của phương thức (method) ghi đè
print('Testing method overriding...')
# Tạo các instance và kiểm tra các phương thức ghi đè
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":
# Kiểm tra việc truy cập thuộc tính (attribute)
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":
# Kiểm tra các điều kiện biên và giá trị ở ranh giới
print('Running boundary_conditions_test test...')
print('Test completed successfully')
elif test_case == "error_handling_test":
# Kiểm tra cách xử lý lỗi và các trường hợp ngoại lệ
print('Running error_handling_test test...')
print('Test completed successfully')
elif test_case == "polymorphic_behavior_test":
# Kiểm tra tính đa hình với nhiều loại đối tượng
print('Running polymorphic_behavior_test test...')
print('Test completed successfully')
elif test_case == "stress_test":
# Kiểm tra khả năng chịu tải với nhiều đối tượng
import time
start_time = time.time()
objects = []
for i in range(50):
try:
objects.append(Transaction(f'test_{i}', 100, None))
except:
pass # Xử lý lỗi khi tạo đối tượng mà không làm gián đoạn chương trình
try:
objects.append(SavingsAccount(f'test_{i}', f'User_{i}'))
except:
pass # Xử lý lỗi khi tạo đối tượng mà không làm gián đoạn chương trình
try:
objects.append(CheckingAccount(f'test_{i}', f'User_{i}'))
except:
pass # Xử lý lỗi khi tạo đối tượng mà không làm gián đoạn chương trình
try:
objects.append(Bank(f'test_{i}'))
except:
pass # Xử lý lỗi khi tạo đối tượng mà không làm gián đoạn chương trình
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":
# Kiểm tra toàn diện
print('=== Comprehensive Validation Test ===')
# Kiểm tra 1: Tạo đối tượng cơ bản
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 ===')Tất cả bài học trong Lập trình hướng đối tượng
1Nền tảng về lập trình hướng đối tượng
Tệp bên ngoàiGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTham số selfPhương thứcThuộc tínhPhương thức khởi tạo (__init__)Ôn tập: máy tính đơn giản4Kế thừa
Kế thừa cơ bảnHàm super()Ghi đè phương thứcKế thừa đa lớpThứ tự phân giải phương thứcÔn tập: hệ thống phân cấp nhân viên7Phương thức đặc biệt
Giới thiệu về phương thức ma thuậtNạp chồng toán tửPhương thức ma thuật của vùng chứaÔn tập: danh sách tùy chỉnh13Thử thách cuối cùng
Nền tảng học trực tuyếnHệ thống ngân hàngPhát triển nhân vật trong trò chơiDịch vụ cho thuê phương tiện2Decorator
Giới thiệu về decoratorDecorator thuộc tínhDecorator phương thức tĩnhDecorator phương thức lớp5Tính đa hình
Xem lại cách ghi đè phương thứcKiểu gõ vịtLớp và phương thức trừu tượngThiết kế giao diệnÔn tập: máy tính hình học8Các khái niệm OOP nâng cao
Kết hợp và kế thừaMixinPhương thức tĩnh và phương thức lớpDecorator lớpTrình quản lý ngữ cảnhTự luyện tập: Trình biên dịch Python online