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

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))

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

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Python函数装饰器是一种特殊类型的函数,它可以用来修改其他函数的功能。装饰器可以在不修改被装饰函数源代码的情况下,为其添加额外的功能。装饰器本质上是一个返回函数函数,它使用了闭包的概念。 Python提供了@符号作为装饰器的语法糖,使得应用装饰器更加方便。使用装饰器时,可以直接在被装饰函数的定义上方使用@符号加上装饰器函数的名称,就可以将被装饰函数作为参数传递给装饰器函数进行处理。 函数装饰器的应用场景很广泛,它可以用于添加日志记录、性能分析、权限验证、缓存等功能。通过使用装饰器,我们可以将这些功能从原始函数中分离出来,提高代码的可读性和可维护性。 以下是一个简单的示例,演示了如何使用函数装饰器: ``` def decorator(func): def wrapper(*args, **kwargs): # 添加额外的功能 print("装饰器添加的功能") # 调用原始函数 return func(*args, **kwargs) return wrapper @decorator def my_function(): print("原始函数") my_function() ``` 在上面的例子中,我们定义了一个装饰器函数`decorator`,它接受一个函数作为参数,并返回一个新的函数`wrapper`。在`wrapper`函数中,我们可以添加额外的功能,并调用原始函数。通过使用`@decorator`语法,我们将`my_function`函数传递给装饰器进行处理。 当我们调用`my_function()`时,实际上调用的是装饰器返回的`wrapper`函数。在执行`wrapper`函数之前,会先执行装饰器添加的额外功能,然后再调用原始函数。 这就是Python函数装饰器的基本原理和用法。通过使用装饰器,我们可以轻松地修改函数的功能,使代码更加简洁和可重用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值