Python学习笔记----装饰器

来源:互联网 发布:化工公司工艺软件 编辑:程序博客网 时间:2024/06/05 03:59

现在有一个函数,其有一个功能:

def myfun():    print("myfunc start")    time.sleep(1)    print("myfunc end")

比如,myfun是一个很常用的函数,但是,每次使用时,需要对该函数进行一个扩展使用,一般可以如下:

    def deco(fun):        startT = time.time()        fun()        endT = time.time()        msecs = (endT - startT) * 1000        print("it's %f ms" % msecs)

deco函数中,传入一个函数,就可以计算出该函数执行的时间。也即对fun函数进行了扩展,称为装饰器。
但是,我们可以发现,传入的fun函数本身没有受到影响,即该装饰不是长久的,所以,进行一下改造

import timedef deco(fun):    def warpper():        startT = time.time()        fun()        endT = time.time()        msecs = (endT - startT) * 1000        print("it's %f ms" % msecs)    return warpperdef myfun():    print("myfunc start")    time.sleep(1)    print("myfunc end")myfun()print("*"*20)myfun=deco(myfun)myfun()

此时,myfun()再进行单独调用的时候,就可以直接打印出该函数的执行时间了,为了简化其中的
myfun=deco(myfun)操作,我们此时可以更加简化为:

import timedef deco(fun):    def warpper():        startT = time.time()        fun()        endT = time.time()        msecs = (endT - startT) * 1000        print("it's %f ms" % msecs)    return warpper@decodef myfun():    print("myfunc start")    time.sleep(1)    print("myfunc end")myfun()print("*"*20)# myfun=deco(myfun)myfun()

利用@符号来进行标记。这样,myfun函数从一个简单的sleep操作,变成了可以打印出其执行时间的函数。如果还需要对其进行其他的装饰,可以写个装饰函数,实现功能的扩展。例如

import timedef deco(fun):    def warpper():        startT = time.time()        fun()        endT = time.time()        msecs = (endT - startT) * 1000        print("it's %f ms" % msecs)    return warpperdef deco2(fun):    def warpper():        fun()        print("deco 2")    return warpper@deco2@decodef myfun():    print("myfunc start")    time.sleep(1)    print("myfunc end")myfun()print("*"*20)# myfun=deco(myfun)myfun()

打印结果为:

myfunc startmyfunc endit's 1000.057459 msdeco 2********************myfunc startmyfunc endit's 1000.056982 msdeco 2

装饰的嵌套,还是很强大的功能吧。
ps:编辑器用pycharm的社区版,免费的,习惯的AndroidStudio,所以倾向于Jetbrain的产品。

原创粉丝点击