Python装饰器的入门理解

本文介绍了Python装饰器的基本概念和应用场景,如日志记录、权限验证等。通过示例展示了如何使用装饰器,包括单个装饰器和多个装饰器的使用方式,强调了装饰器的顺序对功能执行的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 概念

    装饰器:本质是一个python函数,它可以让其他函数在不改变代码的前提下,添加额外的功能,装饰器的返回值也是一个函数对象。

二 使用场景:插入日志,权限验证性能测试事务处理缓存等场景。

三 装饰器的示例

    1.单个装饰器

    import time

    # 给test1函数添加计时器功能
    def dec(func):
        def wrapper(*args, **kwargs):
            start_time = time.time()
            ret = func(*args, **kwargs)
            end_time = time.time()
            # 程序执行的时间
            proc_time = (end_time-start_time)*1000
            print("1-10000数字相加的结果是%d运行的时间是%dms" % (ret,proc_time))
        return wrapper

    @dec      # 装饰器dec的作用是:test1 = dec(test1)
    def test1():
        sum = 0
        for i in range(1,10001):
            sum += i

        return sum

    if __name__ == '__main__':

        test1()

    ~需求升级:在不使用装饰器的情况下,实现上一个功能(实际开发中基本不用这个方式)

    答:只需要把@dec注释,在入口函数(if __name__ == '__main__':)的上一行添加一行代码

           test1 = dec(test1) 即可,示例如下:

    import time

    # 给test1函数添加计时器功能
    def dec(func):
        def wrapper(*args, **kwargs):
            start_time = time.time()
            ret = func(*args, **kwargs)
            end_time = time.time()
            # 程序执行的时间
            proc_time = (end_time-start_time)*1000
            print("1-10000数字相加的结果是%d运行的时间是%dms" % (ret,proc_time))
        return wrapper

    # @dec  # 装饰器dec的作用是:test1 = dec(test1)
    def test1():
        sum = 0
        for i in range(1,10001):
            sum += i
        return sum
    test1 = dec(test1)
    if __name__ == '__main__':

        test1()            

    2.两个装饰器: 

    def say_hi(func):
        print('.....say_hi........')
        def wrapper1(*args, **kwargs):
            print('.....wrapper1........')
            func(*args, **kwargs)
        return wrapper1

    def say_hello(func1):
        def wrapper2(*args, **kwargs):
            print('.....wrapper2........')
            func1(*args, **kwargs)
        return wrapper2          

    @say_hi
    @say_hello
    def test1():        # 装饰器作用 test1 ——> wrapper1 ;   func  ——> wrapper2 ;  func1 ——> test1

        print('.....test1........')

    if __name__ == '__main__':
        test1()

    """
    输出的结果是:
    .....say_hi........
    .....wrapper1........
    .....wrapper2........
    .....test1........

    """

    装饰的顺序: 挨着函数(test1)近的(say_hello)先装饰,远的(say_hi)后装饰, 执行顺序是先执行远的再执行近的。

参考:Python 装饰器:http://python.jobbole.com/82344/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值