首页 > Python装饰器

Python装饰器

#-*- coding: UTF-8 -*-
import time

def foo():
    print('in foo()')

def timeit(func):

    # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
    def wrapper():
        start = time.clock()
        func()
        end =time.clock()
        print ('used:', end - start)

    # 将包装后的函数返回
    return wrapper

@timeit
def foo2():
    print("in foo2")

foo = timeit(foo)
foo()
print("_*_"*20)
foo3= timeit(foo2)
foo3()
print("_*_"*20)
foo2()

结果:

in foo()
used: 0.00016424599357094254
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
in foo2
used: 2.4441368090914078e-05
used: 0.0005895257983528473
_*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*__*_
in foo2
used: 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.

【热门文章】
【热门文章】