码迷,mamicode.com
首页 > 其他好文 > 详细

装饰器

时间:2019-01-01 00:53:22      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:没有   ==   性能   time   调用   例子   执行   inner   校验   

装饰器(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--

装饰器

标签:没有   ==   性能   time   调用   例子   执行   inner   校验   

原文地址:https://www.cnblogs.com/sunjingjingking/p/10203962.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!