函数装饰器
1. 装饰器
# 无参装饰器,这里的参数是指在使用装饰器的时候的参数 import functools def wrapper(func): @functools.wraps(func) def inner(*args, **kwargs): start_time = time.time() res = func(*args, **kwargs) end_time = time.time() print(end_time - start_time) return res return inner # 无参装饰器的使用 @wrapper def func(): pass # 有参装饰器 def auth(driver): def wrapper(func): ... return wrapper # 有参装饰器的使用 @auth(driver='file') def func(): pass
2. 装饰器推导
import time def func(): pass # 步骤一:将计时器功能封装成一个函数 def inner(func): start_time = time.time() res = func() end_time = time.time() print(end_time - start_time) return res # 此时调用方式(inner(函数名)),改变了函数名()的调用放啊 # 步骤二:在函数外面再包一层函数,返回一个函数名,用此函数名加括号来调用函数。函数的参数在内层函数传入 def wrapper(func): def inner(*args, **kwargs): start_time = time.time() res = func(*args, **kwargs) end_time = time.time() print(end_time - start_time) return res return inner # 此时函数的调用方式分两步 func = wrapper(func) # 步骤一 func() # 步骤二 # 此时如果调用方法 a = func.__doc__ # 是inner的注释 b = func.__name__ # 方法名是inner # 解决方法,加一个functools.wraps(func) # 最终写法 import functools def wrapper(func): @functools.wraps(func) def inner(*args, **kwargs): start_time = time.time() res = func(*args, **kwargs) end_time = time.time() print(end_time - start_time) return res return inner # 语法糖,写在函数上方,自动调用func = wrapper(func) @wrapper def func(): pass