1.不带参数的装饰器
下面是一个不带参数的装饰器标准写法,可以看出,装饰器就是一个参数是函数的函数
form functools import wraps
def decorator(func):
# wraps 相当于 让 wrap.__name__=func.__name__,
# wrap.__doc__==func.__doc__
@wraps(func)
def wrap(*arg,**kwargs):
# todo somting
return func(*arg,**kwargs)
return wrap
@decorator
def add(x,y):
return x+y
效果相当于下面
add = decorator(add) # 实际 add 变成了decorator里面的 wraps
add() 相当于运行 wrap()
2.带参数的装饰器
# 定义decorator用来接收自己需要的参数
def decorator(*dec_args,**dec_kwargs):
# 从 wrap 开始相当于不带参数的装饰器,
def wrap(func):
@wraps(func)
def inner(*args,**kwargs):
func(*args,**kwargs)
return inner
return wrap