这个任务聚焦于构建一个健壮的银行账户系统,考察的重点包括:
🧠 任务核心目标
- 理解并运用 面向对象编程(OOP) 的核心概念:类、实例、类属性和方法。
- 掌握 断言(assertions) 的使用,用于验证程序内部逻辑的正确性。
- 实践 防御性编程(defensive programming),防止无效或危险输入。
- 熟悉如何使用并定义 自定义异常(custom errors)。
🧪 测试和验证方向
你需要通过以下几个方面测试 BankAccount 的健壮性和逻辑准确性:
功能 | 测试要点与验证方向 |
账户创建 | 是否正确设置初始余额、账户号是否从 1045 开始递增;初始赠金是否正确添加。 |
存款/取款 | 是否禁止负数交易?是否检查余额和封禁状态?是否触发交易限额检查? |
转账功能 | 金额是否合法?对象是否为 BankAccount?账户是否封禁?余额是否足够? |
封禁与解封 | 是否记录封禁账户?封禁账户是否禁止一切交易?支持“unban_all”恢复操作? |
事务限额限制 | 设置限额后是否正确限制大额取款/转账? |
断言与错误抛出 | 是否在关键逻辑中使用 assert?是否用自定义异常替代内建异常? |
str 格式化 | 输出格式是否符合要求?包括账户名、余额、ID、状态等信息展示? |
🧩 难点提示
- ✅ 合理使用类方法管理账户号与解封逻辑。
- ✅ 正确维护共享类属性
BankAccount.banned_accounts
。
- ✅ 处理各种类型验证与边界值(如 0 金额、极大金额、错误类型)。
- ✅ 同时保持代码清晰、模块化、可测试。
🏦 BankAccount 类设计说明文档
📘 类概述
BankAccount
类模拟银行账户的操作,包括开户、存取款、转账、封禁及交易限额设置等功能。该类使用面向对象编程原则实现了数据封装、类方法与实例方法的结合,并配合自定义异常类对非法操作进行防御性编程。🧱 类结构
属性 / 方法名 | 类型 | 描述 |
accountCounter | int (类属性) | 记录下一账户编号 |
banned_accounts | dict[int, str] (类属性) | 被封禁账户及封禁理由 |
owner | str | 账户所有者姓名 |
balance | float | 账户余额,初始增加 $49.99 |
account_number | int | 唯一账户编号 |
transaction_limit | `float | None` |
🔧 方法说明
__init__(owner: str, initial_balance: float | int)
- 创建账户。
- 初始余额需为正数类型(int 或 float),否则抛出
CustomTypeError
或CustomValueError
。
- 账户默认加上 $49.99 开户奖励。
deposit(amount: float | int)
- 存款方法。
- 要求非负数值,账户未被封禁。
withdraw(amount: float | int)
- 取款方法。
- 检查账户是否封禁,余额是否充足。
transfer_to(target_account: BankAccount, amount: float | int)
- 转账方法。
- 验证双方账户未被封禁,目标账户类型正确,符合交易限额。
ban_account(reason: str)
- 将当前账户封禁,并记录封禁原因。
set_transaction_limit(limit: float | int | None)
- 设置账户的单笔交易限额,可设置为 None 表示无限制。
is_banned() -> bool
- 判断账户是否已被封禁。
__str__() -> str
- 返回账户当前状态的字符串,包含:
- 账户名与编号
- 当前余额(带千分位和两位小数)
- 限额信息(若无则显示 "N/A")
- 是否封禁及封禁理由
类方法
方法 | 描述 |
set_next_account_number(int) | 设置下一个账户编号(用于重置) |
unban_all() | 全部账户解除封禁 |
🧪 错误处理机制(防御性编程)
错误类型 | 条件 | 抛出 |
CustomTypeError | 金额或账户类型不正确 | ㅤ |
CustomValueError | 金额为负 | ㅤ |
CustomOperationError | 操作目标被封禁 | ㅤ |
CustomLimitError | 超出交易限额 | ㅤ |
AssertionError | 余额不足时使用断言 | ㅤ |
总结
整体Task 4 比较简单,写好基础为Task 5打好基础。我们问题不大。