5.22 如何实现函数的连续调用?¶

现在我想写一个函数可以实现把所有的数进行求和,并且可以达到反复调用的目的。
比如这样子。
>>> add(2)(3)(4)(5)(6)(7)
27
当只调用一次时,也必须适用。
>>> add(2)
2
每次调用的返回结果都是一个 int
类型的实例,要实现将一个实例看做一个函数一样调用,那就不得不使用到
__call__
这个魔法方法。
>>> class AddInt(int):
... def __call__(self, x):
... print("calling __call__ function")
... return AddInt(self.numerator + x)
...
>>>
>>> age = AddInt(18)
>>> age
18
>>> age(1)
calling __call__ function
19
有了上面的铺垫,可以在 AddInt 外层再加一层封装即可。
>>> def add(x):
... class AddInt(int):
... def __call__(self, x):
... return AddInt(self.numerator + x)
... return AddInt(x)
...
>>> add(2)
2
>>> add(2)(3)(4)(5)(6)(7)
27
>>>