多个装饰器的用法:
装饰器的调用顺序:与@装饰名 出现的顺序相反,越后出现越先执行
装饰器是可叠加使用的
实现两个装饰器的实例:
import time def deco01(x): def wrapper(*args, **kwargs): print("this is deco01") start_time = time.time() x(*args, **kwargs) end_time = time.time() execution_time = (end_time - start_time)*1000 print("time is %d ms" % execution_time) print("deco01 end here") return wrapper def deco02(x): def wrapper(*args, **kwargs): print("this is deco02") x(*args, **kwargs) print("deco02 end here") return wrapper @deco01 @deco02 def f(a,b): print("be on") time.sleep(1) print("result is %d" %(a+b)) if __name__ == '__main__': f(3,4)
f(a,b)先被deco02装饰 再被deco01装饰
得到结果如下:
参数传递:
两类:
固定参数的装饰器
无固定参数的装饰器
固定参数:
import time def deco(x): def wrapper(a,b): start_time = time.time() x(a,b) end_time = time.time() execution_time = (end_time - start_time)*1000 print("time is %d ms" % execution_time) return wrapper @deco def f(a,b): print("be on") time.sleep(1) print("result is %d" %(a+b)) if __name__ == '__main__': f(3,4)
无固定参数:
def deco(x): def wrapper(*args, **kwargs): start_time = time.time() x(*args, **kwargs) end_time = time.time() execution_time = (end_time - start_time)*1000 print("time is %d ms" %execution_time) return wrapper @deco def f(a,b): print("be on f1") time.sleep(1) print("result is %d" %(a+b)) @deco def f2(a,b,c): print("be on f2") time.sleep(1) print("result is %d" %(a+b+c)) if __name__ == '__main__': f2(3,4,5) f(3,4)
f2() 和 f() 都被装饰