Menu
CoddyTech

回顾:银行账户管理器

本课属于 Coddy Python 学习旅程的“面向对象编程”单元。第 16 课,共 64 课。

challenge icon

挑战

中等

创建一个完整的 BankAccount 类,展示面向对象编程概念,包括类变量、私有属性、属性、getter、setter 和方法。 

1. 创建一个 BankAccount 类,其中包含:

  • 一个类变量 interest_rate,设置为 0.02(2%)
  • 用于存储 __owner_name 和 __balance 的私有实例属性
  • 一个用于初始化这些属性的构造函数

2. 实现属性的 getter 和 setter: 

  • 一个只读属性 owner_name,用于返回账户所有者的姓名
  • 一个 balance 属性,其中包含:
    • 一个返回当前余额的 getter
    • 一个用于验证存款的 setter(拒绝负数金额)
    • 如果验证失败,打印:"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}")
    
    # 尝试设置余额(应使用 setter)
    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()

    # 测试 setter 的验证功能
    account.balance = 5000
    print(f"Balance after setter: ${account.balance}")

    # 测试取款验证
    account.withdraw(10000)
    print(f"Final balance: ${account.balance}")

面向对象编程中的所有课

自己练习: Python 在线编译器