猿问

Python装饰器

#-*-coding:UTF-8-*-
importtime
deffoo():
print('infoo()')
deftimeit(func):
#定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
defwrapper():
start=time.clock()
func()
end=time.clock()
print('used:',end-start)
#将包装后的函数返回
returnwrapper
@timeit
deffoo2():
print("infoo2")
foo=timeit(foo)
foo()
print("_*_"*20)
foo3=timeit(foo2)
foo3()
print("_*_"*20)
foo2()
结果:
infoo()
used:0.00016424599357094254
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
infoo2
used:2.4441368090914078e-05
used:0.0005895257983528473
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
infoo2
used:2.7863159623642037e-05
[Finishedin15.0s]
请说明为什么调用foo3会出现两次used?
慕标5832272
浏览 580回答 2
2回答

回首忆惘然

因为你的foo2已经在定义时就被timeit装饰(语法上@)了一次啦!装饰后的foo2又被timeit显示装饰(函数调用)一次并赋给foo3,所以会出现两次used.

跃然一笑

在foo2上面@timeit已经装饰了一次(这个在你第二次调用foo2的时候都有体现),然后你再用timeit(foo2),这样就等价于:pythondeffoo_two():print("infoo2")foo2=timeit(foo_two)foo3=timeit(foo2)foo3()装饰了两遍.
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答