import time from functools import wraps #不想改变原函数的调用方式,但是还想在原来的函数前后添加功能,选择装饰器 #timer就是一个装饰器, #为了不完全影响原函数引入,warps, def timer(f): @wraps(f) def inner(*args,**kwargs): starttime = time.time() ret = f(*args,**kwargs) endtime = time.time() print(endtime- starttime) return ret return inner @timer #语法糖 @装饰器函数名 语法等于 func = timer(func) def func(a): #被装饰的函数 '''这是一个函数''' time.sleep(1) print("43243",a) return '试试啊看你' # func = timer(func) func('a') ass = func('a') print(ass) print(func.__name__) print(func.__doc__) #原则: 开放闭合原则 # 开放:对扩展是开放的 # 封闭:对修改是关闭的 #装饰器模板------------- def wrapper(f): def inner(*args,**kwargs): '''在被装饰函数之前要做的事''' ret = f(*args,**kwargs) '''在被装饰函数之后要做的事''' return ret return inner #多层装饰器修饰一个函数 def wrapper1(func): def inner1(): print('wrapper1,before func') ret = func() print('wrapper1,after func') return ret return inner1 def wrapper2(func): def inner2(): print('wrapper2,before func') ret = func() print('wrapper2,after func') return ret return inner2 def wrapper3(func): def inner3(): print('wrapper3,before func') ret = func() print('wrapper3,after func') return ret return inner3 @wrapper3 @wrapper2 @wrapper1 def f(): print('hahah ') return '哈哈哈' print(f())
思维导图------执行步骤