Menu
CoddyTech

Ô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.

challenge icon

Thử thách

Trung bình

Tạ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_rate có giá trị 0.02 (2%)
  • Các thuộc tính instance riêng tư cho __owner_name và __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_name trả về tên chủ tài khoản
  • Một thuộc tính balance vớ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ề False nếu số tiền không dương
    • Trả về True nế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ề False nếu số tiền không dương
    • In ra "Insufficient funds" và trả về False nếu số tiền vượt quá số dư
    • Trả về True nế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

Tự luyện tập: Trình biên dịch Python online