装饰器:增加新功能,但不改变原来的调用方式,也不改变原函数的代码。
# 无参装饰器:2层?
from functools import wraps
def auth(func):
# func = 被装饰对象的内存地址
@wraps(func)
def wrapper(*args,**kwargs):
# 将原函数的属性赋值给装饰器:
# 1)手动复制
# wrapper.__name__ = func.__name__
# wrapper.__doc__ = func.__doc__
# 2)用系统提供的装饰器wraps
# from functools import wraps
# ...
# @wraps
# ...
# 1.调用原函数
# 2.增加新功能
# ......
res = func(*args,**kwargs)
# ......
return res
return wrapper # 闭包,保证wrapper可用func的参数
@auth # 等价于 index=auth(index)
def index(x,y):
print("output---%s,%s"%(x,y))
index(1,2)
# 有参装饰器:3层?
from functools import wraps
def auth(db_type):
def deco(func):
# func = 被装饰对象的内存地址
@wraps(func)
def wrapper(*args,**kwargs):
# 将原函数的属性赋值给装饰器:
# 1)手动复制
# wrapper.__name__ = func.__name__
# wrapper.__doc__ = func.__doc__
# 2)用系统提供的装饰器wraps
# from functools import wraps
# ...
# @wraps
# ...
# 1.调用原函数
# 2.增加新功能
# ......
res = func(*args,**kwargs)
# ......
return res
return wrapper # 闭包,保证wrapper可用func的参数
return deco
@auth(db_type='mysql') # 1)@deco # 2)index = deco(index) # 3) index=wrapper
def index(x,y):
print("output---%s,%s"%(x,y))
index(1,2)
|