装饰函数
2016-05-27 17:12
183 查看
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
相关文章推荐
- 动态顺序表的基本操作
- CAS (1) —— Mac下配置CAS到Tomcat(服务端)(转)
- DEDECMS之九 文章采集
- 单例
- ldconfig命令的作用
- JAVA CAS原理深度分析
- Android异步任务处理之AsyncTaskLoader的使用
- Freemodbus RTU在stm32上的移植分析
- Android基础之AsyncTask详解,巨细哟
- ubuntu15.04下broadcom无线驱动安装
- 海量数据去重之SimHash算法简介和应用
- 引体向上练习
- Qt动画效果的实现,QPropertyAnimation
- 求素数
- 在ASP.NET MVC 中获取当前URL、controller、action(转)
- Centos6.6下安装MariaDB步骤,利用yum进行安装
- 1134 最长递增子序列(暴力写的)
- C# Task 用法
- 第十四周阅读程序(2)
- uva10976—分数拆分