两次调用successor方法报错TypeError: object is not callable的原因是什么
报错原因
核心问题是你的BaseHandler类中方法名和要赋值的实例属性名完全重名,都是successor,触发了Python的属性查找优先级规则:
- 第一次执行
h1.successor(h2)时,h1实例还没有名为successor的自有属性,Python会向上查找类属性,找到successor方法正常执行,执行过程中给h1新增了一个实例属性self.successor = h2,也就是把ScoreHandler2的实例赋值给了h1.successor。 - 第二次执行
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
相关产品推荐
相关产品推荐

