本文摘自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中的%是什么意思
Python中add函数怎么用
Python发展至今有哪些版本,各版本有什么区别?
Python单链表中如何查找和删除节点?
Python模块之time模块介绍
%s在Python中是什么意思
Python读写文件的代码示例
Python3.6.4如何安装到树莓派3代
Python中where()函数的用法详解
Python数据类型的区别
更多相关阅读请进入《Python》频道 >>
人民邮电出版社
python入门书籍,非常畅销,超高好评,python官方公认好书。
转载请注明出处:木庄网络博客 » python装饰器的深入浅出