修饰器就是一个返回函数的高阶函数
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from functools import wraps
def log(func):
#@wraps(func) #如果不加这句,log返回wrapper,那么hack.__name__ 就是 wrapper.
def wrapper(*args,**kwargs):
print('call %s'% func.__name__)
return func(*args,**kwargs)
return wrapper
@log
def hack():
print('hello world !!!')
print(hack.__name__)
如果decorator本身需要传入参数,那就需要编写一个返回decorator的高阶函数,写出来会更复杂。比如,要自定义log的文本
def log(text):
def decorator(func):
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
这个3层嵌套的decorator用法如下:
@log('execute')
def now():
print('hello world!')
和两层嵌套的decorator相比,3层嵌套的效果是这样的:
>>> now = log('execute')(now)