一文教你搞懂python函数装饰器(wrapper)

本文介绍了Python中的函数装饰器概念,通过一个实例展示了如何使用装饰器实现函数执行时间的测量。装饰器在函数调用前后添加额外操作,如鉴权或日志记录。在示例中,定义了一个名为`timer`的装饰器,它记录了函数开始和结束时间,从而计算并打印了函数执行的耗时。应用装饰器的函数`foo`在运行时,首先显示开始时间,然后执行函数主体,最后输出结束时间和运行时间。

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

python函数装饰器

函数装饰器,定义一个装饰器后,调用该装饰器,个人理解是在目标函数前后做一些操作。
例如:定义一个鉴权的函数装饰器,在给目标函数的时候添加装饰函数就可以做到先鉴权,鉴权成功再运行目标函数

装饰器模板参考如下:

#模板
# 装饰器:wrapper
# 模板:
# def    装饰器名(func):                    #def 与 @之后的函数名称一致   调用函数func与ret=func(*args,**kwargs)内部函数一致
#     def wrapper(*args,**kwargs):         #def 与 return 之后的函数名称一致
#         ret = func(*args,**kwargs)
#         return ret                       #return ret 与 ret=func(*args,**kwargs)一致
#     return wrapper
# 
# @装饰器名
# def foo():
#     pass

来一段实例:

import time

def timmer(fun1):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        print('start_time:',start_time)#调用foo函数之前的处理
        print('----------调用函数foo前的操作-----------')
        res=fun1(*args,**kwargs)#被装饰的函数,以下指代foo,相当于调用函数foo
        print('----------调用函数foo后的操作-----------')
        stop_time=time.time()#调用foo函数之后的处理
        print('stop_time:',stop_time)
        print('run time is %s' %(stop_time-start_time))
        return res
    return wrapper

@timmer
def foo():
    time.sleep(3)
    print('from foo')

# @timmer
# def foo1():
#     time.sleep(5)
#     print('from foo1')

foo()
# foo1()

运行的顺序如下:
1.装饰器会将函数进行装饰,然后先执行装饰前的代码

        start_time=time.time()
        print('start_time:',start_time)#调用foo函数之前的处理
        print('----------调用函数foo前的操作-----------')

2.接着会执行被装饰函数的代码

    time.sleep(3)
    print('from foo')

3.最后执行的是被装饰函数后的代码

        print('----------调用函数foo后的操作-----------')
        stop_time=time.time()#调用foo函数之后的处理
        print('stop_time:',stop_time)
        print('run time is %s' %(stop_time-start_time))

运行结果如下:
在这里插入图片描述

Python中,装饰器是一种特殊的函数,它可以用来修改或增强其他函数的功能。装饰器的作用是将被装饰的函数作为参数传递给装饰器函数,并返回一个新的函数,这个新函数通常包含了对原函数的功能增强或修改。装饰器通常用于添加额外的功能,比如日志记录、性能分析、输入验证等。通过使用装饰器,我们可以在不修改原函数代码的情况下,对其进行功能增强。 在引用中,给出了一个多个装饰器装饰一个函数的示例。这个示例中,有两个装饰器`wrapper1`和`wrapper2`,它们分别对函数`f`进行了装饰。装饰器是通过在函数定义的上方使用`@`语法来应用的。在这个示例中,`@wrapper1`修饰器被放在`@wrapper2`修饰器之前,这意味着先应用`wrapper1`装饰器,然后再应用`wrapper2`装饰器。最终,函数`f`被装饰成了`wrapper2(wrapper1(f))`的形式。 在引用中,给出了另一个装饰器的示例。这个示例中,装饰器`timmer`被应用到函数`foo`上。装饰器`timmer`定义了一个内部函数`wrapper`,它在调用被装饰的函数`foo`之前和之后分别输出了一些信息,并计算了函数的运行时间。最终,函数`foo`被装饰成了`timmer(foo)`的形式。 在引用中,给出了一个装饰器模板的参考代码。这个模板可以用作定义自己的装饰器。其中,`装饰器名`和`模板`是需要替换成具体的装饰器名称和模板代码的部分。模板中包含了一个装饰器函数的基本结构,其中定义了一个内部函数`wrapper`,并将被装饰的函数作为参数传递给这个内部函数。最终,返回内部函数`wrapper`作为装饰器函数的结果。 综上所述,Python中的装饰器是一种用于修改或增强其他函数功能的特殊函数。通过应用装饰器,我们可以在不修改原函数代码的情况下对其进行功能增强。装饰器可以通过在函数定义上方使用`@`语法来应用,也可以自定义装饰器函数并按照一定的模板进行编写。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值