之前就了解到了装饰器, 但是就会点皮毛, 而且对其调用方式感到迷茫,正好现在的项目我想优化,就想到了用装饰器, 因此深入研究了下装饰器.
先看下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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 的是一个函数名,按道理来讲,返回的就是一个函数地址啊!我理解有问题?随后上网查资料,又是闭包....但是我个人对它不感冒,随后自己分析,总结出了一段程序,看完你就知道原因了.
程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# 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()()) # 调用无参数的嵌套函数... |
这和我们的装饰器不像吗?这就是我们的装饰器!因此,我们可以按照上面的程序来理解,也就是说它是首先确定参数个数,随后分别传入的,下面,我们来改写代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
# 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' ) |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/zhiyong-ITNote/p/7384955.html