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

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

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 time
def deco(fun):
    def warpper():
        startT = time.time()
        fun()
        endT = time.time()
        msecs = (endT - startT) * 1000
        print("it's %f ms" % msecs)
    return warpper
def myfun():
    print("myfunc start")
    time.sleep(1)
    print("myfunc end")

myfun()
print("*"*20)
myfun=deco(myfun)
myfun()

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

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

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

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

def deco2(fun):
    def warpper():
        fun()
        print("deco 2")
    return warpper

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

myfun()
print("*"*20)
# myfun=deco(myfun)
myfun()

打印结果为:

myfunc start
myfunc end
it's 1000.057459 ms
deco 2
********************
myfunc start
myfunc end
it's 1000.056982 ms
deco 2

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值