Python预算类transfer方法异常:转账后目标类别无更新如何解决?
预算应用转账问题修复
问题根源
你代码里有两个关键错误导致转账操作无法在目标类别中体现:
transfer方法错误创建新实例:你在transfer里用Category(new_category).deposit(...),这会新建一个和目标类别同名的临时对象,转账记录仅存在这个临时对象中,方法执行完毕后就会被销毁,完全没影响到你之前创建的housing实例。- 调用
transfer时传参错误:你写的food.transfer(480, "housing")传的是字符串"housing",但方法需要接收的是已经实例化好的Category对象。
修复步骤
1. 修改transfer方法
让它直接操作传入的目标实例,同时加入余额校验避免无效转账:
def transfer(self, amount, target_category): # 通过withdraw先检查余额并完成扣款 if self.withdraw(amount, f"Transfer to {target_category.category}"): # 给目标类别添加转账收入记录 target_category.deposit(amount, f"Transfer from {self.category}") return True # 转账成功返回True return False # 余额不足返回False
2. 优化withdraw方法(可选但更合理)
添加余额校验逻辑,防止余额不足时执行扣款:
def withdraw(self, amount, description=""): if self.get_balance() >= amount: self.ledger.append({"amount": -amount, "description": description}) return True return False
3. 修正transfer调用方式
把传入字符串改为传入已实例化的对象:
# 原错误调用: # food.transfer(480, "housing") # 修改为: food.transfer(480, housing)
完整修复代码
class Category: def __init__(self, category): self.category = category self.ledger = [] def deposit(self, amount, description=""): self.ledger.append({"amount": amount, "description": description}) def withdraw(self, amount, description=""): if self.get_balance() >= amount: self.ledger.append({"amount": -amount, "description": description}) return True return False def get_balance(self): # 用sum简化余额计算逻辑 return sum(item["amount"] for item in self.ledger) def transfer(self, amount, target_category): if self.withdraw(amount, f"Transfer to {target_category.category}"): target_category.deposit(amount, f"Transfer from {self.category}") return True return False def __str__(self): return f"This is the budget for {self.category}" # 测试代码 food = Category("food") housing = Category("housing") food.deposit(1000, "initial deposit") # 存入足够金额确保转账可执行 food.withdraw(400, "Indomie") food.transfer(480, housing) print(food) print(food.ledger) print(food.get_balance()) print(housing.ledger) print(housing.get_balance())
效果说明
修改后,housing的ledger会新增一条来自food的转账收入记录,余额同步增加480;food的ledger会出现对应的转出记录,余额正确扣除。
内容的提问来源于stack exchange,提问作者John Okoye
相关产品推荐
相关产品推荐

