Python 装饰器

Oct 15, 2015


装饰器可以对一个函数、方法或者类进行加工,个人理解为一个闭包,下面就来看一下装饰器的几种使用方法


使用方法

  • 无参数装饰器

    • 相当于foo=deco(foo)

    • 使用

    
     def deco(func):
         print("deco")
         return func
    
     @deco
     def foo():
         print("foo")
     
  • 装饰器有参,函数无参

    • 相当于foo = deco(argv)(foo)

    • 使用

    
     def deco(argv):
         def decorator(func):
             print("decorator")
             return func
         print(argv)
         return decorator
    
     @deco("123")
     def foo():
         print("foo")
     
  • 装饰器、函数都有参

    • 相当于foo = deco(argv)(foo)(data)

    • 使用

    
     from functools import wraps
    
     def deco(argv):
         def decorator(func):
             @wraps(func)
             def wrapper(*args, **kwargs):
                 return func(*args, **kwargs)
             print("decorator")
             return wrapper
         print(argv)
         return decorator
    
     @deco("123")
     def foo(data):
         "this is foo"
         print("foo")
         print(data)
     

其他

  • 注意多个装饰器的执行顺序,应该是先执行下面的,然后是上面的。这里应先执行deco1,然后是deco2

    @deco2
    @deco1