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

image0

现在我想写一个函数可以实现把所有的数进行求和,并且可以达到反复调用的目的。

比如这样子。

>>> 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
>>>

image1