本文摘自php中文网,作者黄舟,侵删。
这篇文章主要和大家一起深入浅出的学习python装饰器的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下之前就了解到了装饰器, 但是就会点皮毛, 而且对其调用方式感到迷茫,正好现在的项目我想优化,就想到了用装饰器, 因此深入研究了下装饰器.
先看下代码:
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 " )
|
我的疑惑就是明明return 的是一个函数名,按道理来讲,返回的就是一个函数地址啊!我理解有问题?随后上网查资料,又是闭包....但是我个人对它不感冒,随后自己分析,总结出了一段程序,看完你就知道原因了.
程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | def funX(x):
def funY():
return x
return funY
def funX1():
print ( "调用函数funX1" )
def funY1():
print ( "调用函数funY1" )
return funY1
if __name__ = = '__main__' :
print (funX1()())
|
这和我们的装饰器不像吗?这就是我们的装饰器!因此,我们可以按照上面的程序来理解,也就是说它是首先确定参数个数,随后分别传入的,下面,我们来改写代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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
def foo(arg):
print ( "in foo() %s" % (arg))
if __name__ = = '__main__' :
timeif(foo)( ' Hello' )
|


以上就是python装饰器的深入浅出的详细内容,更多文章请关注木庄网络博客!!
相关阅读 >>
Python中join是什么意思
什么是Python items函数?怎么使用它?
Python语言是一种什么类型
5个常用 Python 标准库
Python实现用生成器实现可迭代对象的方法
简单谈谈Python的pycurl模块_Python
Python有switch语句吗
Python基础知识之二:网络通信数据传输
Python实现购物系统实例介绍
Python安装以后怎么用
更多相关阅读请进入《Python》频道 >>
人民邮电出版社
python入门书籍,非常畅销,超高好评,python官方公认好书。
转载请注明出处:木庄网络博客 » python装饰器的深入浅出