菜鸟对Python装饰器的不解之处,python装饰不解之处,#-*- coding:
菜鸟对Python装饰器的不解之处,python装饰不解之处,#-*- coding:
#-*- coding: UTF-8 -*-import timedef foo(): print('in foo()')def timeit(func): # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装 def wrapper(): start = time.clock() func() end =time.clock() print ('used:', end - start) # 将包装后的函数返回 return wrapper@timeitdef foo2(): print("in foo2")foo = timeit(foo)foo()print("_*_"*20)foo3= timeit(foo2)foo3()print("_*_"*20)foo2()
结果:
in foo()used: 0.00016424599357094254_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_in foo2used: 2.4441368090914078e-05used: 0.0005895257983528473_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_in foo2used: 2.7863159623642037e-05[Finished in 15.0s]
请说明为什么调用foo3 会出现两次used?
在foo2上面@timeit已经装饰了一次(这个在你第二次调用foo2的时候都有体现), 然后你再用timeit(foo2), 这样就等价于:
pythondef foo_two(): print("in foo2")foo2 = timeit(foo_two)foo3 = timeit(foo2)foo3()
装饰了两遍.
因为你的foo2已经在定义时就被timeit装饰(语法上@)了一次啦! 装饰后的foo2又被timeit显示装饰(函数调用)一次并赋给foo3, 所以会出现两次used.
编橙之家文章,
相关内容
- Python优化字节码遇到的问题,python优化字节码,问题背景
- 防止别人修改flask开发的web应用,服务器加密应该怎么做
- python多线程执行语句块问题求助,python多线程,import t
- Python在特定区域内刷新倒计时效果的方法是什么,pyt
- 问一个关于Gevent与Tornado调用库的问题,geventtornado,Gev
- python for循环print怎样才能输出csv呢,pythoncsv,import csv,
- Python有简洁方式可以完成多个分隔符分割字符串吗,
- python setup.py方式安装包正确删除方法,pythonsetup.py,我用
- Python requests模块下载文件遇413请求实体过大错误,req
- Python函数调用输出问题新手,python函数,要求 01、定
评论关闭