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

Python预算计算器调用求和函数触发TypeError: 'int' object is not callable

报错诱因
  • 核心问题是实例属性与类方法命名冲突,触发了Python的属性查找优先级规则:
    1. 父类Budgeter的初始化方法中,给所有子类实例默认创建了self.expenses的整数属性,初始值为0
    2. 子类Expenses中又定义了同名的expenses()方法
    3. Python访问实例成员时会优先匹配实例自身的属性,而非类的方法:你实例化exp = Expenses()后,exp.expenses指向的已经是初始值为0的整数,你尝试将其作为函数调用,就会抛出'int' object is not callable的报错
修复方案

只需要修改任意一个重名的命名即可,推荐两种修改方式:

方式1:修改方法名(对现有逻辑改动最小)

将计算总费用的方法改名为不会和属性冲突的名称,比如calc_expenses,同时对应修改调用处的代码:

# 修改Expenses类的方法定义
class Expenses(Budgeter):
    def __init__(self):
        super().__init__()

    def calc_expenses(self, expense_list):
        self.expenses = sum(expense_list)
        return self.expenses

# 修改调用处代码
totexpenses = exp.calc_expenses(args.expenses)

方式2:修改实例属性名

将父类中存储总费用的属性改名,避免和方法名冲突:

# 修改父类Budgeter的属性命名
class Budgeter:
    def __init__(self):
        self.wage = 0
        self.netincome = 0
        self.total_expenses = 0 # 从expenses改为total_expenses
        self.hours = 0

# 对应修改Expenses类的方法逻辑
class Expenses(Budgeter):
    def __init__(self):
        super().__init__()

    def expenses(self, expense_list):
        self.total_expenses = sum(expense_list)
        return self.total_expenses

额外优化:原方法中先将self.expenses赋值为费用列表再求和的逻辑可以合并,减少不必要的中间赋值操作。

内容的提问来源于stack exchange,提问作者drxjason

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:15:10