Lazy loaded image
Task 4 - Banking at Goldman Stanl
Words 695Read Time 2 min
2025-5-31
这个任务聚焦于构建一个健壮的银行账户系统,考察的重点包括:

🧠 任务核心目标

  • 理解并运用 面向对象编程(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),否则抛出 CustomTypeErrorCustomValueError
  • 账户默认加上 $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打好基础。我们问题不大。