python3--__call__拦截调用
__call__拦截调用
当实例调用时,使用__call__方法。不,这不是循环定义:如果定义了,Python就会为实例应用函数调用表达式运行__call__方法。这样可以让类实例的外观和用法类似于函数。
#!/usr/bin/env python # -*- coding:utf-8 -*- class Prod: def __init__(self, value): self.value = value def __call__(self, other): return self.value * other x = Prod(2) print(x(3)) print(x(4))
运行结果:
6 8
在这个例子中,__call__似乎没什么特别的意义。下面这个简单的方法也能提供类似功能。
#!/usr/bin/env python # -*- coding:utf-8 -*- class Prod: def __init__(self, value): self.value = value def comp(self, other): return self.value * other x = Prod(3) print(x.comp(3)) print(x.comp(4))
运行结果:
9 12
然而,当需要为函数的API偏写接口时,__call__就变得很有用:这可以编写遵循所需要的函数来调用接口对象,同时又能保留状态信息。事实上,这可能是除了__init__构造方法以及_str__和__repr_显示格式方法外,第三个最常用的运算符重载方法了。