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

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属性反而会让第一次调用就报错,本质也是同一个命名冲突问题。
修复方法

不要让存储计算结果的实例属性和方法重名,有两种常见改法:

  1. 直接在方法内计算返回值,不额外绑定实例属性(最推荐,避免属性值和实际参数不同步的问题):
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"
  1. 如果需要把计算结果存在实例上复用,给存储值的属性换个不和方法重名的名字,比如前面加单下划线标识内部属性:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 06:21:19