__call__
在python中,函数其实是一个可调用的对象,实例对象可以用函数的形式表示
一个类实例可以变成一个可调用的对象,只需要实现方法__call__()
一、把类Myclass变成可调用的对象:
class Myclass(object): def __init__(self, fn): self.name = fn print fn def __call__(self, *args, **kwargs): print "My name is ..." self.name(*args, **kwargs) print "My friend is ..." def getInfo(test): print test cls = Myclass(getInfo) cls('Tim') 打印: <function myfun at 0x1005ed2a8> <function getInfo at 0x1005e0ed8> My name is ... Tim My friend is ...
二、把实例对象用类似于函数的形式表示,
class Test(): def __init__(self): pass def __call__(self, num): sum = 0 for i in range (num): sum += i return sum t = Test() print t(10) 打印: 45
Python装饰器:使用类来定义装饰器(Python中类实例可以当做函数一样调用)
class Myclass(object): def __init__(self, fn): self.name = fn print fn def __call__(self, *args, **kwargs): print "My name is ..." self.name(*args, **kwargs) print "My friend is ..." def getInfo(ni): print ni @Myclass def myfun(name, gender): print "start..." print name print gender print "end..." myfun('Bob', 'male') 打印: <function myfun at 0x1005ee2a8> My name is ... start... Bob male end... My friend is ...
小编只是举个例子。小编在实际项目中的调用场景是:
一、计算一个网页的pv流量
二、控制某些网页的访问,例如必须登录才能访问
三、在某些函数的前后打印必要的日志信息
综上:都是为了简化函数的一些流程,将统一的代码规范化,避免函数一些共性的代码重复书写