美文网首页
python装饰器万能模板

python装饰器万能模板

作者: 数据小黑升值记 | 来源:发表于2019-02-27 20:50 被阅读0次

    装饰器万能模板

    装饰器函数的本质:闭包函数

    def wrapper(func): #装饰器函数,func为被装饰函数   
            def inner(*args,**kwargs):        
                """被装饰函数前需要添加的内容"""                 
                ret=func(*args,**kwargs) #被装饰函数        
                """被装饰函数后需要添加的内容"""        
                return ret   
            return inner
    
    • *args :按照位置传值,多余的参数都给args,以元祖的形式存储

    • **kwargs :按照关键字传值,多余的参数个kwargs,以字典的形式存储

    使用方法

    @wrapper
    def fun():
        print('你好')
    

    @wrapper 被称为语法糖,@+装饰器函数名称,写在函数上放,装饰距离最近的函数。

    此符号等价于fun=wrapper(fun)

    再次执行被装饰函数时,实际执行的是装饰器内部函数inner

    装饰器优势

    可以在不改变原函数的的基础上为函数添加新的功能,满足对拓展是开放的,对修改是封闭的原则。

    装饰器进阶

    1. 带参数装饰器

    如果想使用@wrapper(flag)类似这样带参数的装饰器,需要在装饰器外层再嵌套一层函数,然后return之前的wrapper函数。

        def out_wrapper(flag):     
             def wrapper(func): #装饰器函数,func为被装饰函数   
                    def inner(*args,**kwargs):        
                            """被装饰函数前需要添加的内容"""                 
                            ret=func(*args,**kwargs) #被装饰函数        
                            """被装饰函数后需要添加的内容"""        
                            return ret   
                    return inner
            return wrapper
    

    2. 多个装饰器调用

    def wrapper1(func):
        def inner(*args,**ksargs):
            print('wrapper1')
            ret=func()
            print('wrapper1')
            return ret
        return inner
    
    
    def wrapper2(func):
        def inner(*args,**ksargs):
            print('wrapper2')
            ret=func()
            print('wrapper2')
            return ret
        return inner
    
    def wrapper3(func):
        def inner(*args,**ksargs):
            print('wrapper3')
            ret=func()
            print('wrapper3')
            return ret
        return inner
    
    @wrapper3
    @wrapper2
    @wrapper1
    def fun():
        print('func1')
    
    fun()
    

    多个装饰器,运行顺序是从距离被装饰函数最近的一个装饰器开始的,即从wrapper1,wrapper2,wrapper3,一层一层嵌套,但从打印的结果可知,在被装饰函数之前运行的是从外到内的顺序,之后运行的是从内到外的顺序,类似套娃的结构。

    打印结果如下:

    wrapper3
    wrapper2
    wrapper1
    func1
    wrapper1
    wrapper2
    wrapper3
    

    相关文章

      网友评论

          本文标题:python装饰器万能模板

          本文链接:https://www.haomeiwen.com/subject/hcdquqtx.html