一般实现python装饰器都是采用方法的模式,看起来有点复杂,模式如下:
def send_msg_simple(url): def decorator(func): def wrapper(*args, **kw): func(*args, **kw) group_robot(url, "完毕:%s.%s" % (kw['db'], kw['table'])) return wrapper return decorator
但其实也可以采用类的方式,看起来逻辑更为清晰:
class DecoratorTest(object): #定义一个类 def __init__(self,func): self.__func = func def __call__(self): #定义call方法,当直接调用类的时候,运行这里。 print('pre msg') self.__func() print('post msg') @DecoratorTest def test(): print('主函数体') if __name__=='__main__': test()
下面是cookbook上的类装饰器实现,略有不同
# 为了将装饰器定义成一个类,你需要确保它实现了 __call__() 和 __get__() 方 法。 # 例如,下面的代码定义了一个类,它在其他函数上放置一个简单的记录层: import types from functools import wraps class Profiled: def __init__(self, func): wraps(func)(self) self.ncalls = 0 def __call__(self, *args, **kwargs): self.ncalls += 1 return self.__wrapped__(*args, **kwargs) def __get__(self, instance, cls): if instance is None: return self else: return types.MethodType(self, instance) # 你可以将它当做一个普通的装饰器来使用,在类里面或外面都可以: @Profiled def add(x, y): return x + y class Spam: @Profiled def bar(self, x): print(self, x)