Python预算计算器调用求和函数触发TypeError: 'int' object is not callable
报错诱因
- 核心问题是实例属性与类方法命名冲突,触发了Python的属性查找优先级规则:
- 父类
Budgeter的初始化方法中,给所有子类实例默认创建了self.expenses的整数属性,初始值为0 - 子类
Expenses中又定义了同名的expenses()方法 - 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
相关产品推荐
相关产品推荐

