作用
在不修改原函数定义的前提下,动态地增加函数的功能。
实现方式
通过定义一个高阶函数,接受被装饰的函数作为参数,返回一个包装函数。
例子
一个打印helloworld的函数,我们需要在函数执行前打印函数名。
def log(func):
def wrapper(*args,**kw):
print('call %s():'%func.__name__)
return func(*args,**kw)
return wrapper
@log # 等同于 msg=log(msg)
def msg():
print('hello, world')
当给msg加上log的装饰器后,msg实际上已经是wrapper函数了。(print(msg.__name__)
结果为wrapper)但有时我们需要原函数名,所以我们可以给wrapper加上functools模块里面的wraps装饰器。
import functools
def log(func):
@functools.wraps(func)
def wrapper(*args,**kw):
print('call %s():'%func.__name__)
return func(*args,**kw)
return wrapper
@log # 等同于 msg=log(msg)
def msg():
print('hello, world')
当然我们也可以自己实现wraps装饰器
def wraps(func1):
def decorator(func2):
def wrapper(*args,**kw):
return func2(*args,**kw)
wrapper.__name__=func1.__name__
return wrapper
return decorator