Python如何创建支持多次链式调用的Add类可调用实例?
实现支持链式调用的Add类
要解决“object not callable”错误并实现链式调用,核心是让__call__方法返回可调用的对象(实例本身或新实例),同时让实例能以数值形式展示结果。
方案1:基于可变实例(累加状态保留在实例中)
这种方式下,实例会持续累加所有传入的值,状态会被保留:
class Add: def __init__(self, initial_value): self.total = initial_value # 初始化累加总和 def __call__(self, value): self.total += value # 累加新值 return self # 返回实例自身,允许继续链式调用 def __repr__(self): return str(self.total) # 打印/直接引用实例时显示总和 # 可选:让实例可直接转换为数值类型 def __int__(self): return self.total def __float__(self): return float(self.total)
使用示例:
obj1 = Add(10) print(obj1) # 输出:10 result1 = obj1(12) print(result1) # 输出:22(10+12) result2 = obj1(12)(10) print(result2) # 输出:32(10+12+10) result3 = obj1(12)(10)(9) print(result3) # 输出:41(10+12+10+9)
方案2:基于不可变实例(每次调用返回新实例,状态独立)
如果希望每次链式调用都是独立的累加链(不修改原实例状态),可以让__call__返回新的Add实例:
class Add: def __init__(self, total): self.total = total def __call__(self, value): return Add(self.total + value) # 返回新实例,保留当前累加结果 def __repr__(self): return str(self.total)
使用示例:
obj1 = Add(10) print(obj1) # 输出:10 # 新的调用链不影响原实例 chain1 = obj1(12) print(chain1) # 输出:22 print(obj1) # 输出:10(原实例未被修改) chain2 = chain1(10)(9) print(chain2) # 输出:41(10+12+10+9)
错误原因分析
你遇到的“object not callable”错误,通常是因为__call__方法返回了不可调用的类型(比如直接返回数值)。例如如果你的__call__直接返回self.total,那么第一次调用后得到的是数值,再次调用数值就会触发这个错误。只要保证__call__返回的是可调用的Add实例,就能避免这个问题。
内容的提问来源于stack exchange,提问作者Hesam Ameri
相关产品推荐
相关产品推荐

