在代码运行期间动态增加功能的方式,称之为装饰器;
比如,在函数调用前后自动打印日志,检查权限,过滤请求等;
1. 简单用法
执行test_dec()方法前打印 call function_name
>>> def dec(func):
... def wrapper(*args,**kw):
... print "call %s"%func.__name__
... return func(*args, **kw)
... return wrapper
>>> @dec
... def test_dec():
... print "test"
>>> test_dec()
call test_dec
test
>>>
2.带参数的装饰器
>>> def log(text):
... def dec(func):
... @functools.wraps(func)
... def wrapper(*args, **kw):
... print ('%s, %s') % (text, func.__name__)
... return func(*args, **kw)
... return wrapper
... return dec
...
>>>
>>> @log('test')
... def test():
... print 'testcc'
...
>>>
>>> test()
test, test
testcc
>>>
3.在执行方法的前后动态切入执行代码
>>> import functools
>>> import time
>>> def log(text):
... def metric(fn):
... @functools.wraps(fn)
... def wrapper(*args,**kw):
... begin=time.time()
... fv=fn(*args,**kw)
... end=time.time()
print('%s %s() executed in %s ms' % (text,fn.__name__,end-begin))
... ... return fv
return wrapper
return metric... ...
...
>>>
>>> @log('testcc')
... def fast(x, y):
... time.sleep(0.12)
... return x+y
>>> fast(1, 2)
testcc fast() executed in 0.12248301506 ms
3
>>>