1、什么是装饰器?
#在不改变原函数的调用的情况下,为原函数增加一些额外的功能,打印日志,执行时间,登录认证
2、装饰器的形成过程
# 需求写一个函数测试另一个函数的执行效率 最初的实现方式,但是改变了函数的调用方式,需要改进 def timer(f1): start_time = time.time() f1() end_time = time.time() print(end_time- start_time) timer(func1)
改进后调用方式基本相似,但是多加了两行代码 def timer(f1): start_time = time.time() f1() end_time = time.time() print(end_time- start_time) f = func1 func1 = timer func1(f) #== timer(func1)
最优的方法 def timer(f1): def inner(): start_time = time.time() f1() end_time = time.time() print(end_time - start_time) return inner func1 = timer(func1) #做下关系转换 func1()
通过python提供的语法塘实现装饰器 def timer(f1): def inner(): start_time = time.time() f1() end_time = time.time() print(end_time - start_time) return inner @timer == func1 = timer(func1) def func1(): print("晚上回去吃烧烤") time.sleep(0.3) @timer == func2 = timer(func2) def func2(): print("晚上回去和啤酒") time.sleep(0.3) func1() func2()
# 装饰器传参 def timer(f1): def inner(*args, **kwargs): start_time = time.time() f1(*args, **kwargs) end_time = time.time() print(end_time - start_time) return inner @timer #== func1 = timer(func1) def func1(a, b): print("晚上回去吃烧烤") time.sleep(0.3) @timer #== func2 = timer(func2) def func2(a, b): print("晚上回去和啤酒") time.sleep(0.3) func1(111,222) #参数首先传到inner()函数 *args,然后在传到f1()函数中 func2(222,333)
# 函数返回值 def timer(f1): def inner(*args, **kwargs): start_time = time.time() ret = f1(*args, **kwargs) end_time = time.time() print(end_time - start_time) return ret return inner @timer #== func1 = timer(func1) def func1(a, b): print("晚上回去吃烧烤") time.sleep(0.3) return 666 ret = func1(1, 2) print(ret)
装饰器的写法规范 def wrapper(f1): def inner(*args, **kwargs): 执行函数之前的操作 ret = f1() #返回值 执行函数之后的操作 return ret return inner