Python类方法首次调用正常 修改属性后报int not callable错误
问题原因
报错核心是实例方法和实例属性命名冲突,和setter逻辑没有关系:
- 首次调用
calories_burned()时,实例自身还没有绑定calories_burned属性,Python会自动找到类中定义的同名方法执行,因此运行正常 - 方法执行时你写了
self.calories_burned = xxx的赋值语句,直接给当前实例绑定了一个同名的实例属性。由于Python属性查找优先级中,实例属性高于类方法,后续你再调用calories_burned()时,拿到的是存在实例里的整数/字符串值,把基础类型当函数加括号调用,自然会抛出int not callable/str not callable错误。 - 你之前尝试在构造函数里预定义
calories_burned属性反而会让第一次调用就报错,本质也是同一个命名冲突问题。
修复方法
不要让存储计算结果的实例属性和方法重名,有两种常见改法:
- 直接在方法内计算返回值,不额外绑定实例属性(最推荐,避免属性值和实际参数不同步的问题):
def calories_burned(self): if self.intensity == "Low": return str(4 * self.duration) elif self.intensity == "Medium": return str(8 * self.duration) elif self.intensity == "High": return str(12 * self.duration) # 可加默认值处理非法强度输入 return "0"
- 如果需要把计算结果存在实例上复用,给存储值的属性换个不和方法重名的名字,比如前面加单下划线标识内部属性:
def calories_burned(self): self._calories_burned = 0 if self.intensity == "Low": self._calories_burned = str(4 * self.duration) elif self.intensity == "Medium": self._calories_burned = str(8 * self.duration) elif self.intensity == "High": self._calories_burned = str(12 * self.duration) return self._calories_burned
内容的提问来源于stack exchange,提问作者gigilynne
相关产品推荐
相关产品推荐

