Python面向对象银行存扣款代码优化咨询
银行账户代码优化方案
一、优化初始化逻辑,提升灵活性
原代码中初始余额固定为0,可通过给__init__添加可选参数,支持自定义初始余额,同时保持默认值兼容原有逻辑。另外给账户ID生成逻辑添加注释,明确自增规则。
class Account: last_id = 1000 # 账户起始ID,自增生成唯一标识 def __init__(self, customer, initial_balance=0): self.customer = customer # 生成唯一账户ID Account.last_id += 1 self.id = Account.last_id # 验证初始余额合法性 if initial_balance < 0: raise ValueError("初始余额不能为负数") self._balance = initial_balance
二、提取通用金额验证逻辑,减少代码冗余
存款和扣款操作都需要验证金额合法性(大于0、为数字类型),将这部分逻辑提取为私有方法,实现代码复用,也便于后续统一修改验证规则。
def _validate_positive_amount(self, amount): if not isinstance(amount, (int, float)): raise TypeError("金额必须为数字类型") if amount <= 0: raise NegativeAmountException("操作金额必须大于0")
三、修复核心方法的逻辑漏洞
- 存款(deposit)方法:原代码中金额≤0时错误打印“操作成功”,改为抛出异常;移除无用的
pass语句,操作成功后返回更新后的余额而非直接打印,降低控制台输出耦合。 - 扣款(charge)方法:原代码未实现余额扣减逻辑,且存在无用的
else: pass,补充扣减操作并简化条件判断流程。
优化后的核心方法:
def deposit(self, amount): self._validate_positive_amount(amount) self._balance += amount return self._balance def charge(self, amount): self._validate_positive_amount(amount) if amount > self._balance: raise NotEnoughBalanceException(f"账户余额不足,当前余额:{self._balance}") self._balance -= amount return self._balance
四、规范自定义异常类的实现
原代码中使用的自定义异常未定义,显式创建继承自内置Exception的异常类,便于异常捕获和区分。
class NegativeAmountException(Exception): """操作金额为负数或零的异常""" pass class NotEnoughBalanceException(Exception): """账户余额不足的异常""" pass
五、提升代码通用性的扩展点
- 支持账户类型扩展:将
Account作为基类,子类可实现不同账户的特殊规则(如储蓄账户的利息计算、信用卡账户的透支额度):
class SavingsAccount(Account): def __init__(self, customer, initial_balance=0, interest_rate=0.02): super().__init__(customer, initial_balance) self.interest_rate = interest_rate def add_interest(self): """计算并添加利息""" interest = self._balance * self.interest_rate self._balance += interest return interest
- 添加安全的余额查询接口:对外提供只读的余额访问方式,避免直接操作私有属性
_balance:
@property def balance(self): return self._balance
- 操作日志记录:添加日志方法,记录每笔操作的类型、金额、时间,便于后续审计:
import datetime def _log_operation(self, op_type, amount): timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") print(f"[{timestamp}] 账户{self.id} {op_type}:{amount},当前余额:{self._balance}")
内容的提问来源于stack exchange,提问作者Mery p.
相关产品推荐
相关产品推荐

