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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:02:54