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

两次调用successor方法报错TypeError: object is not callable的原因是什么

报错原因

核心问题是你的BaseHandler类中方法名和要赋值的实例属性名完全重名,都是successor,触发了Python的属性查找优先级规则:

  1. 第一次执行h1.successor(h2)时,h1实例还没有名为successor的自有属性,Python会向上查找类属性,找到successor方法正常执行,执行过程中给h1新增了一个实例属性self.successor = h2,也就是把ScoreHandler2的实例赋值给了h1.successor。
  2. 第二次执行h1.successor(h2)时,Python优先匹配到了h1的自有实例属性successor,它的值是ScoreHandler2的实例对象,这个对象本身不是可调用的函数/方法,所以直接抛出TypeError。

你校验callable(ScoreHandler2)返回True不冲突:ScoreHandler2类本身是可调用的(调用类会生成实例),但报错的是ScoreHandler2的实例对象不可调用,二者不是同一个对象。

修复方法

把方法名和实例属性名区分开即可,比如修改为:

class BaseHandler:
    # 方法名修改为set_successor,不和实例属性重名
    def set_successor(self, successor):
        self.successor = successor

class ScoreHandler1(BaseHandler):
    pass

class ScoreHandler2(BaseHandler):
    pass

h1 = ScoreHandler1()
h2 = ScoreHandler2()
h1.set_successor(h2)
h1.set_successor(h2) # 多次调用不会再报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:15:03