应用举例:
比如在一个web 后台中,我希望每次用户调用某个API都生成日志,而且日志格式可能随时变化,比如:
(1) 记录用户提交的参数
(2) 记录当前函数执行的时间
此时我们希望能有一个优美的实现方法,一个额外的函数包含住被装饰的函数,这就是装饰器。
# 不定参数
def origin(a,*parameters,**kwargs):
print("函数:%s" %(origin.__name__))
print("a=%s" %a)
print(parameters)
print(*parameters)
print(kwargs)
origin(1,2,3,4,name="jianfeng")
""" 输出:
函数:origin
a=1
(2, 3, 4)
2 3 4
{'name': 'jianfeng'}
"""
# 手工实现装饰器
def outer(fun):
def wrapper(*args):
print("%s is running at 0:0" %fun.__name__)
fun(*args)
return wrapper
def hello(name):
print("hello,%s" %(name))
a=outer(hello)
a("cjf")
""" 输出:
hello is running at 0:0
hello,cjf
"""
# 语法糖@decorator_fun 实现装饰器
def decorator(fun):
def wrapper(*args):
print("%s is running" % fun.__name__)
return fun(*args)
return wrapper
@decorator
def hello(name):
print("hello,%s" %name)
hello("chenjianfeng")
# 功能如上图