摘自廖雪峰老师的博客
装饰器
定义:代码在运行期间动态增加功能的方式,称之为“装饰器”。
装饰器接收一个函数作为参数,也返回一个函数。
既然装饰器接收一个函数作为参数,所以装饰器是高阶函数。
例1
import functools
def log(func):
@functools.wraps(fun)
def wrapper(*args, **kwargs):
print '%s' % func.__name__
func(*args, **kwargs)
return wrapper
@log
def now():
print "456"
now()
print now.__name__
解释:
1.核心:@log相当于执行了now = log(now);
2.所以,返回的wrapper函数赋给了now变量,now变量此时指向wrapper函数,调用now()就是调用wrapper函数,即:先打印函数名,再调用原始func函数,即now()函数;
3.@functools.wraps(fun)作用:把原始func函数的__name__属性复制到wrapper()函数中,因为有些代码的执行依赖函数签名。加不加这行,print now.__name__的结果不同。
例2
import functools
def log(text):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
func(*args, **kw)
return wrapper
return decorator
@log('execute')
def now():
print('2015-3-25')
now()
print now.__name__
解释:
1.核心:@log('execute')相当于执行了 now = log('execute')(now);
2.所以,先执行log('execute')返回decorator函数;再执行decorator(now)返回wrapper函数;之后逻辑同例1(返回的wrapper函数赋给了now变量,now变量此时指向wrapper函数,调用now()就是调用wrapper函数,即:先打印函数名,再调用原始func函数,即now()函数);
3.同例1的3;