装饰器

Posted sunjingjingking

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关的知识,希望对你有一定的参考价值。

装饰器(decorator)

  • 装饰器本质上是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。

  • 应用场景:插入日志,性能测试,事务处理,缓存,权限校验

  • 作用:为了已经存在的函数或者对象添加额外的功能

    例子1:
    def w1(func):
      def inner():
          #可以加if判断
          print("---验证---")
          func()
      return inner
    
    #f1=w1(f1)
    @w1
    def f1():
      print(‘f1‘)
    
    #调用
    f1()

双层装饰器

  • 装饰是从下装到上,调用是从上到下。

    def w1(func):
      print("--正在装饰1--")
      def inner():
          print("--正在验证1--")
          func()
      return inner
    
    def w2(func):
      print("--正在装饰2--")
      def inner():
          print("--正在验证2--")
          func()
      return inner
    
    @w1
    @w2
    def f1():
      print("--f1--")
    #装饰倒着装,调用是从上到下。
    f1()
    
    ###执行结果###
    --正在装饰2--
    --正在装饰1--
    --正在验证1--
    --正在验证2--
    --f1--

装饰器不定长参数

def timefun(func):
    #接受函数的参数
    def wrappedfunc(*args, **kwargs):
        print("fun_name is %s"%(func.__name__))
        func(*args, **kwargs)
    return wrappedfunc

@timefun
def foo(a, b, c):
    print(a + b + c)

foo(1,2,3)

>>>fun_name is foo
>>>6

装饰器return

def func(fun):
    def func_in(*args,**kwargs):
        #ret保存return 返回值,如果没有返回值为None
        ret = fun(*args,**kwargs)
        return ret
    return func_in

@func
def test(args):
    print("---%s--"%(args))
    return "haha"
print(test(1))

装饰器带参数

def func_arg(arg):
    def fun(fun):
        def func():
            print("--记录日志--%s"%(arg))
            if arg=="heihei":
                fun()
            else:
                pass
        return func
    return fun

#1.先执行func_arg函数,return 结果是这个fun函数
#等于使用@fun 对test进行装饰
@func_arg("heihei")
def test():
    print("--test--")

test()

--记录日志--heihei
--test--

以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象学习之八,装饰器

thymeleaf 片段渲染后重新加载 javascript

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码