对装饰器的一点理解

看了很多关于装饰器的文章,发现还是要手动自己写写代码,总结总结才能加深印象。
1、装饰器用来扩展已有函数的功能,在不改变函数内部结构的情况,扩展函数的功能。
2、装饰器传入的是一个函数,返回的也是一个函数。

def demo1(func):
    def spend():
        start_time = time.time()
        func()
        end_time = time.time()
        total_time = (end_time - start_time) * 1000
        print("函数耗时%d ms" % total_time)

    return spend  # 注意pycharm自动补齐,会加上一个括号,这里不需要括号
    
@demo1
def test():
    s = 0
    for i in range(101):
        s = s + i
        time.sleep(0.1)
    print(s)


if __name__ == '__main__':
    test()

得到如下结果
在这里插入图片描述
3、多个装饰器

def demo2(func):
    def sheet():
        print("测试开始")
        func()
        print("测试结束")

    return sheet


@demo1
@demo2
def test():
    s = 0
    for i in range(101):
        s = s + i
        time.sleep(0.1)
    print(s)

先执行第二个装饰器,再执行第一个装饰器,最后执行函数本身,输出结果如下,
在这里插入图片描述
4、当函数中有不定长的参数时,使用收集参数

def demo3(func):
    def tester(*args, **kwargs):
        print("start test...")
        func(*args, **kwargs)
        print("end test...")

    return tester


@demo3
def plus(a, b, c):
    print(a+b+c)


if __name__ == '__main__':
    plus(10, 12, 15)

输出结果如下,
在这里插入图片描述
5、当被装饰的函数中会return一个值时,必须在装饰器中,return被装饰函数的结果。否则执行函数返回的是None。

def demo3(func):
    def tester(*args, **kwargs):
        print("start test...")
        ret = func(*args, **kwargs)
        print("end test...")
        return ret  # 这里返回被装饰函数的return结果

    return tester


@demo3
def plus(a, b, c):
    return a+b+c


if __name__ == '__main__':
    print(plus(10, 12, 15))

输出如下,
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值