装饰器的本质:一个闭包函数
装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展
import time def func(): time.sleep(0.01) print("加油") def timer(f): #装饰器函数 def inner(): start = time.time() f() #被装饰函数 end = time.time() print(end - start) return inner func = timer(func) func()
#不修改原有的函数调用方式,但原有函数前后添加功能
#timer就是一个装饰器函数只是对一个函数有一些装饰作用
语法糖:
import time def timer(func): def inner(): start = time.time() func() print(time.time() - start) return inner @timer #==> func1 = timer(func1) 语法糖:@装饰器的名字 def func1(): 被装饰的函数 time.sleep(0.1) print('in func1') func1()
带有返回值
import time def timer(func): def inner(*args,**kwargs): start = time.time() re = func(*args,**kwargs) print(time.time() - start) return re return inner @timer #==> func2 = timer(func2) def func2(a): print('in func2 and get a:%s'%(a)) return 'fun2 over' func2('aaaaaa') print(func2('aaaaaa')) #输出返回值
# 装饰器模式 def warpper(func): def inner(*args, **kwargs): re1 = func(*args, **kwargs) # 修饰函数 return re1 return inner # 无括号 @warpper # 等价于 func = warpper(func)---返回值是 inner def func(*args, **kwargs): print("123") re1 = func() # 函数inner---返回值是re1