玩蛇网提供最新Python编程技术信息以及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.

玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/wenda/wd19151.html

相关文章 Recommend

玩蛇网Python互助QQ群,欢迎加入-->: 106381465 玩蛇网Python新手群
修订日期:2017年05月22日 - 11时52分55秒 发布自玩蛇网

您现在的位置: 玩蛇网首页 > Python问题解答 > 正文内容
我要分享到:

必知PYTHON教程 Must Know PYTHON Tutorials

必知PYTHON模块 Must Know PYTHON Modules