如何让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
代码说明
- 继承int:让Add实例直接拥有整数的所有行为(比如参与数值运算),同时可以扩展自定义的调用逻辑。
- __new__方法:由于int是不可变类型,需要用
__new__来创建实例并初始化累加值total。 - __call__方法:每次调用时计算新的累加值,返回一个全新的Add实例,这样就能支持无限链式调用。
- __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
相关产品推荐
相关产品推荐

