装饰器

作者: w_wm_m | 来源:发表于2018-11-04 14:31 被阅读0次

    装饰器

         为了动态拓展函数,而不去破坏原函数的调用,产生了装饰器。通常使用装饰器给函数加log。

    单层装饰器

    def trim(f):
        def inner(*args,**kwargs):
            print("1"*10)
            ret = f(*args,**kwargs)
            print("1"*10)
            return ret
        return inner
    
    """
    @trim : func = trim(func)
    """
    @trim
    def func(*args,**kwargs):
        for i,j in enumerate(*args):
            print(i,j)
        print(kwargs)
        return args
    
    if __name__ == '__main__':
        func([1,3],name="hhh")
    
    单层装饰器.png

         以上是一个单层装饰器,trim是装饰函数,func是被装饰函数。@trim是Python中的一颗语法糖,它等价于func = trim(func)。


    执行过程.png

         使用func.__name__查看func的名字可以发现它其实是inner。

    tips:

    • 如果被装饰函数没有参数 ,inner也可以不用带参数,但是如果被装饰函数有了参数,inner函数必须带有参数,因为在inner函数中调用func时,必须要有参数,这时的参数只能来自于inner。一般来说,无论被装饰函数有没有参数,我们都会给inner两个参数,一个可变参数,一个关键字参数。
    • 同样如果被装饰函数有返回值,需要在inner中调用func进行保存,然后在inner中返回这个值

    多层装饰器

    def trim(f):
        def inner(*args,**kwargs):
            print("1"*10)
            ret = f(*args,**kwargs)
            print("1"*10)
            return ret
        return inner
    
    def wrap(f):
        def wahia(*args,**kwargs):
            print("2"*10)
            ret = f(*args,**kwargs)
            print("2"*10)
            return ret
        return wahia
    
    """
    @wrap : func = wrap(func)
    @trim : func = trim(func)
    """
    @wrap
    @trim
    def func(*args,**kwargs):
        for i,j in enumerate(*args):
            print(i,j)
        print(kwargs)
        return args
    
    if __name__ == '__main__':
        func([1,3],name="hhh")
        # print(func.__name__)
    
    多层装饰器.png

         多层装饰器的时候,要注意位置,位置不同所产生的结果也会不同。以上是func先被trim装饰,返回inner,此时func = inner,在此之上再被wrap装饰,返回wahia。所以func.__name__是wahia。

    相关文章

      网友评论

          本文标题:装饰器

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