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

如何让Python的Add类实例通过__call__与继承支持多括号多次调用?

解决Add类链式调用报错问题

问题根源

你当前的代码中,__call__方法直接输出或返回整数结果,导致Add(10)(11)返回的是21这个int对象。当你尝试继续调用(12)时,本质是在调用一个整数,自然会触发'int' object is not callable错误——整数不具备可调用的特性。

要实现多组括号的链式调用,核心是让每次调用()后,返回的依然是可继续调用的Add类实例,而非直接返回数值。

解决方案代码

结合继承(继承自int,让实例天然具备整数特性)和__call__方法,实现如下:

class Add(int):
    def __new__(cls, a):
        # 继承int时需用__new__初始化实例(int是不可变类型)
        instance = super().__new__(cls, a)
        instance.total = a
        return instance

    def __call__(self, number):
        # 返回新的Add实例,传递累加后的数值
        return Add(self.total + number)

    def __repr__(self):
        # 打印实例时直接输出累加值
        return str(self.total)

测试验证

>>> Add(10)
10
>>> Add(10)(11)
21
>>> Add(10)(11)(12)
33
>>> Add(2)(3)(5)(7)
17

代码说明

  1. 继承int:让Add实例直接拥有整数的所有行为(比如参与数值运算),同时可以扩展自定义的调用逻辑。
  2. __new__方法:由于int是不可变类型,需要用__new__来创建实例并初始化累加值total。
  3. __call__方法:每次调用时计算新的累加值,返回一个全新的Add实例,这样就能支持无限链式调用。
  4. __repr__方法:确保打印实例时直接显示累加的数值,符合示例中的输出要求。

非继承替代方案

如果不需要继承int,也可以通过实现数值转换方法达到效果:

class Add:
    def __init__(self, a):
        self.total = a

    def __call__(self, number):
        return Add(self.total + number)

    def __repr__(self):
        return str(self.total)

    def __int__(self):
        return self.total

这个版本的实例同样支持链式调用,且可以通过int(Add(10)(11))转换为整数。

内容的提问来源于stack exchange,提问作者Mohammad Ali Soltan Hosseini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 05:02:07