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

Posted python真好用

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文教你搞懂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))

运行结果如下:

以上是关于一文教你搞懂python函数装饰器(wrapper)的主要内容,如果未能解决你的问题,请参考以下文章

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

一文彻底搞懂 Python中的装饰器偏函数

一文彻底搞懂 Python中的装饰器偏函数

一文教你搞懂C语言的Q格式使用

一文让你搞懂javascript如何实现继承

python装饰器