You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python预算类transfer方法异常:转账后目标类别无更新如何解决?

预算应用转账问题修复

问题根源

你代码里有两个关键错误导致转账操作无法在目标类别中体现:

  1. transfer方法错误创建新实例:你在transfer里用Category(new_category).deposit(...),这会新建一个和目标类别同名的临时对象,转账记录仅存在这个临时对象中,方法执行完毕后就会被销毁,完全没影响到你之前创建的housing实例。
  2. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 00:07:36