之前就了解到了装饰器, 但是就会点皮毛, 而且对其调用方式感到迷茫,正好现在的项目我想优化,就想到了用装饰器, 因此深入研究了下装饰器.

先看下代码:

import time

# 将函数作为参数传入到此方法....
def timeif(func):
def wrapper(arg):
print("in wrapper() %s" % (arg))
start = time.clock()
func(arg)
end = time.clock()
print("used: %s %s" % (end-start, arg))
return wrapper @timeif
def foo(arg):
print("in foo() %s" % (arg)) if __name__ == '__main__':
foo(" Hello ") # 表示执行foo函数....

我的疑惑就是明明return 的是一个函数名,按道理来讲,返回的就是一个函数地址啊!我理解有问题?随后上网查资料,又是闭包....但是我个人对它不感冒,随后自己分析,总结出了一段程序,看完你就知道原因了.
程序:

# coding=utf-8
# 带参数的函数 返回一个函数地址就行....
def funX(x):
def funY():
return x
return funY # 不带参数的函数....
def funX1():
print("调用函数funX1") def funY1():
print("调用函数funY1")
return funY1 if __name__ == '__main__':
# print(funX(5)()) # 调用有参数的嵌套函数... print(funX1()()) # 调用无参数的嵌套函数...

这和我们的装饰器不像吗?这就是我们的装饰器!因此,我们可以按照上面的程序来理解,也就是说它是首先确定参数个数,随后分别传入的,下面,我们来改写代码:

# coding=utf-8
import time # 将函数作为参数传入到此方法....
def timeif(func):
def wrapper(arg):
print("in wrapper() %s" % (arg))
start = time.clock()
func(arg)
end = time.clock()
print("used: %s %s" % (end-start, arg))
return wrapper # @timeif
def foo(arg):
print("in foo() %s" % (arg)) if __name__ == '__main__':
timeif(foo)(' Hello')

最新文章

  1. Android开发笔记:SQLite导入导出数据
  2. bzoj 1834: [ZJOI2010]network 网络扩容
  3. 对git认识
  4. Android UI开发第三十四篇——SlidingPaneLayout
  5. N3292系列资料之RTC介绍
  6. 第一百零八节,JavaScript,内置对象,Global对象字符串编码解码,Math对象数学公式
  7. Java 反射实例
  8. Java命名默认规范
  9. std::shared_ptr<void>的工作原理
  10. ES5.0集群搭建
  11. remote: Permission to user_name/Code.git denied to other_user_name. fatal: unable to access 'https://github.com/user_name/Code.git/': The requested URL returned error: 403
  12. 带着萌新看springboot源码10(springboot+JdbcTemplate+druid)
  13. msf中exploit的web_delivery模块
  14. style.width与offsetWidth的区别
  15. 【做题】POJ3469 Dual Core CPU——第一道网络流
  16. Nginx 做代理服务器时浏览器加载大文件失败 ERR_CONTENT_LENGTH_MISMATCH 的解决方案
  17. 利用Java剖析工具JProfiler查找内存泄漏的方法
  18. UVA-4288 Cat vs. Dog (最大独立集)
  19. [转]MFC子线程更改图像数据后更新主窗口图像显示方法
  20. DOM对象与JQuery对象

热门文章

  1. 如何优雅地退出python程序
  2. ExtJS学习(三)Grid表格
  3. Xcode中不用Storyboard,用纯xib创建TabBar模式视图
  4. Android软件设置自动检查更新
  5. ExpandableListView简单应用及listview模拟ExpandableListView
  6. App引导界面,可以这么玩
  7. shell入门之expr的使用
  8. 深入浅出Java Dom4j读取XML
  9. J2EE学习从菜鸟变大鸟之五 JDBC(Java Data Base Connectivity)
  10. pig强制转换(字符到整数):首位0怎么处理,‘01’到1的转化,