装饰器和闭包关联很大,要先明白闭包是什么

原始代码:

def foo():
print('fcc')

增加装饰器

from time import ctime,sleep
def w(fcc):
def inner():
print("%s called %s" % (fcc.__name__,ctime())) fcc()
return inner @w
def foo():
print('fcc')

调用foo(),结果为:

foo called Fri Mar  ::
fcc

可以看到,在不修改foo函数的前提下,增加了foo函数被调用时的执行过程

@w内部执行的过程

1、执行w函数,并将@w下的函数作为w函数的参数:

  @w等价于w(foo)

  返回w的内部函数inner(),

  即:

  def inner():
print("%s called %s" % (fcc.__name__,ctime())) fcc()

2、执行w函数后的返回值

  将执⾏完的w1函数返回值 赋值 给@w1下⾯的函数的函数名f1 即将w1

  的返回值再重新赋值给 f1

  新fcc = def inner():

        print("%s called %s" % (fcc.__name__,ctime()))

        fcc()

  这样,执⾏ fcc 函数时,就会执⾏ 新fcc 函数,在新fcc
  函数内部先执⾏装饰器的内容,再执⾏原来的fcc函数,然后将原来fcc函数的返回
  值返回给了调用者

装饰器的作用:

1. 引⼊⽇志
2. 函数执⾏时间统计
3. 执⾏函数前预备处理
4. 执⾏函数后清理功能
5. 权限校验等场景
6. 缓存

最新文章

  1. App Store最新审核标准,中文版
  2. 单向关系中的JoinColumn
  3. 小结:ac自动机
  4. http://blog.csdn.net/qiutongyeluo/article/details/52468081
  5. C# Listview 第一列不能居中
  6. iOS中-Qutarz2D详解及使用
  7. 你想不到的压缩方法:将javascript文件压缩成PNG图像存储
  8. python打包成exe
  9. 解决项目打包过程检出项目出现 svn:e15500错误
  10. Eclipse中javascript文件 clg 变为console.log();
  11. 用python做小说网站
  12. 为django项目配置celery的后台启动
  13. shell脚本中给字符串添加颜色
  14. python的变量和简单的数据类型
  15. Python爬取网易云歌单
  16. 过三关 Java冒泡排序选择排序插入排序小练习
  17. [CNBETA]Intel CPU底层漏洞事件完全详解:全球手机/电脑无一幸免[转帖]
  18. 2017-2018-2 20165215 实验二 Java面向对象程序设计
  19. 多线程数据库查询(ADO)
  20. android studio Gradle Build速度加快方法

热门文章

  1. textarea多行文本框自适应高度
  2. HDU 3938 Portal (离线并查集,此题思路很强!!!,得到所谓的距离很巧妙)
  3. oracle数据库——常用的数据类型
  4. android学习:Android上面部署Apache FTPServer
  5. iOS之UIButton扩大按钮的响应区域
  6. 歌词解析&class
  7. vue项目获取当前地址栏参数(非路由传参)
  8. Vue 自动获取最新的Vue文件
  9. Innodb和Mysiam引擎的区别
  10. html5手机浏览器启动微信客户端支付实例