python3 - 装饰器


装饰器(decorator)应用的场景:
1、引入日志
2、函数执行时间统计
3、执行函数前预备处理
4、执行函数后清理处理
5、权限校验等场景
6、缓存


# 通用装饰器
import functools

def log(func):
# 若是不加这个,test()函数经过装饰后,test.__name_ 变成了 wrapper
# 让test.__name_ 仍为test,不需要编写wrapper.__name__ = func.__name__,Python内置的functools.wraps就是干这个事
@functools.wraps(func)
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper

# 针对带参数的装饰器
import functools

def log(text):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator

# 只要python解释器执行到了这个代码,那么就会自动的进行装饰,
# 而不是等到运行的的时候才装饰

# 1、先执行log('ok')函数,这个函数return的结果就是decorator这个函数的引用
# 2、进而使用@decorator对test进行装饰
@log('ok') # 相当于执行了 now = log('execute')(now)
def test():
print('...test...')

# 在调用test之前,就已经进行了装饰
test()
print(test.__name__) # test
posted @ 2017-08-21 21:37  猪快跑  阅读(202)  评论(0编辑  收藏  举报