菜鸟对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.

编橙之家文章,

评论关闭