import functools def log(func): @functools.wraps(func) def wrapper(*args, **kw): print('call %s():' % func.__name__) print('begin call') func(*args, **kw) print('end call') return wrapper @log def now(): print('2015-3-20') now() now = log(now) now() 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 @log('execute') def now_dec(): print('2015-3-25') now_dec() now_dec = log('execute')(now_dec) now_dec()
其中三层嵌套的理解:
now = log(now) 的意思是 先去调用 log 函数 ,那么会去输出 call now() 跟 bengin call ,接下来调用 func 其实就是去调用 log(now) 中 的 now 函数,这个时候的 now 其实就是 def now() ,但是 这个 now 函数 添加了 装饰函数 @log ,所以又回去调用 log 函数,这个调用的时候是 二层嵌套,直接执行以下就可以,最后执行完成之后会跳回到上一次还没执行完的地方 即 :end call