回顾:银行账户管理器
本课属于 Coddy Python 学习旅程的“面向对象编程”单元。第 16 课,共 64 课。
挑战
中等创建一个完整的 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 在线编译器