Ôn tập: trình quản lý tài khoản 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 16 trên 64.
Thử thách
Trung bìnhTạo một lớp BankAccount hoàn chỉnh để minh họa các khái niệm lập trình hướng đối tượng, bao gồm biến lớp, thuộc tính riêng tư, thuộc tính, hàm lấy giá trị, hàm thiết lập và phương thức.
1. Tạo lớp BankAccount với:
- Một biến lớp
interest_ratecó giá trị0.02(2%) - Các thuộc tính instance riêng tư cho
__owner_namevà__balance - Một hàm khởi tạo để khởi tạo các thuộc tính này
2. Triển khai hàm lấy giá trị và hàm thiết lập cho thuộc tính:
- Một thuộc tính chỉ đọc
owner_nametrả về tên chủ tài khoản - Một thuộc tính
balancevới:- Hàm lấy giá trị trả về số dư hiện tại
- Hàm thiết lập xác thực các khoản nạp tiền (từ chối số tiền âm)
- Nếu xác thực thất bại, in ra:
"Balance cannot be negative"
3. Triển khai các phương thức:
deposit(amount)sẽ:- Cộng vào số dư nếu số tiền dương
- In ra
"Deposit amount must be positive"và trả vềFalsenếu số tiền không dương - Trả về
Truenếu thành công
withdraw(amount)sẽ:- Trừ vào số dư nếu số tiền dương và có đủ tiền
- In ra
"Withdrawal amount must be positive"và trả vềFalsenếu số tiền không dương - In ra
"Insufficient funds"và trả vềFalsenếu số tiền vượt quá số dư - Trả về
Truenếu thành công
apply_interest()sẽ:- Cộng tiền lãi vào số dư dựa trên lãi suất của lớp
- Trả về số tiền lãi
display_info()in thông tin tài khoản theo định dạng này:Account Owner: [owner_name] Balance: $[balance] Interest Rate: [interest_rate]%
Yêu cầu về định dạng đầu ra
- Tất cả thông báo lỗi xác thực phải được in chính xác như đã chỉ định
- Phương thức
display_info()phải định dạng đầu ra chính xác như trên - Lãi suất cần được hiển thị dưới dạng phần trăm (nhân với 100)
Tự làm thử
from bank_account import BankAccount
# Xử lý test case
test_case = input()
if test_case == "account_creation":
# Kiểm tra việc tạo tài khoản
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":
# Kiểm tra chức năng nạp tiền
account = BankAccount("Bob", 500)
print(f"Initial balance: ${account.balance}")
# Nạp tiền hợp lệ
result = account.deposit(300)
print(f"Deposit result: {result}")
print(f"New balance: ${account.balance}")
# Nạp tiền không hợp lệ
result = account.deposit(-50)
print(f"Negative deposit result: {result}")
print(f"Balance after invalid deposit: ${account.balance}")
elif test_case == "withdraw_method":
# Kiểm tra chức năng rút tiền
account = BankAccount("Charlie", 1000)
# Rút tiền hợp lệ
result = account.withdraw(400)
print(f"Withdrawal result: {result}")
print(f"Balance after withdrawal: ${account.balance}")
# Rút tiền không hợp lệ (số âm)
result = account.withdraw(-50)
print(f"Negative withdrawal result: {result}")
# Rút tiền không hợp lệ (vượt quá số dư)
result = account.withdraw(1000)
print(f"Excessive withdrawal result: {result}")
print(f"Final balance: ${account.balance}")
elif test_case == "property_access":
# Kiểm tra việc truy cập và bảo vệ thuộc tính (property)
account = BankAccount("Dave", 800)
print(f"Owner via property: {account.owner_name}")
print(f"Balance via property: ${account.balance}")
# Thử đặt số dư (nên dùng phương thức setter)
account.balance = 1200
print(f"Balance after valid setter: ${account.balance}")
# Thử đặt số dư không hợp lệ
account.balance = -500
print(f"Balance after invalid setter: ${account.balance}")
# Thử truy cập trực tiếp các thuộc tính riêng tư (sẽ thất bại)
try:
print(account.__owner_name)
except AttributeError:
print("Cannot access private owner_name directly")
elif test_case == "apply_interest":
# Kiểm tra việc áp dụng lãi suất
account = BankAccount("Eve", 2000)
# Kiểm tra số dư ban đầu
print(f"Initial balance: ${account.balance}")
# Áp dụng lãi suất
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":
# Kiểm tra định dạng của phương thức display_info
account = BankAccount("Frank", 1500)
# Thay đổi lãi suất để kiểm tra biến của lớp
original_rate = BankAccount.interest_rate
BankAccount.interest_rate = 0.03
print("Display info output:")
account.display_info()
# Khôi phục lãi suất ban đầu
BankAccount.interest_rate = original_rate
elif test_case == "original_test_case":
# Chạy đoạn code kiểm thử gốc của thử thách
account = BankAccount("Coddy", 1000)
# Thực hiện các thao tác
account.deposit(500)
account.withdraw(200)
account.apply_interest()
# Hiển thị thông tin tài khoản
account.display_info()
# Kiểm tra khả năng xác thực của setter
account.balance = 5000
print(f"Balance after setter: ${account.balance}")
# Kiểm tra khả năng xác thực khi rút tiền
account.withdraw(10000)
print(f"Final balance: ${account.balance}")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ê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ảnh3Thuộc tính của lớp
Biến của instance và biến của lớpDecorator thuộc tínhThuộc tính riêng tưÔn tập: trình quản lý tài khoản ngân hàngTự luyện tập: Trình biên dịch Python online