python装饰器

参考:
装饰器 http://www.cnblogs.com/wupeiqi/articles/4980620.html
生成器generator生成迭代器iterrator http://www.cnblogs.com/alex3714/articles/5765046.html


用法:
@+装饰器函数名
被装饰的函数名和函数体
功能:
将被装饰的函数名作为传入参数传给装饰器函数
装饰器函数的返回值是被包裹的函数名,该返回值赋值给被装饰的函数(原来的函数在这时整个不执行了)

一种通用的装饰器用法:
def w1(func):
    def inner(*args,**kwargs):
        # 验证1
        # 验证2
        # 验证3
        return func(*args,**kwargs)
    return inner
 
@w1
def f1(arg1,arg2,arg3):
    print 'f1'

问题:一个函数可以被多个装饰器装饰吗?可以!

def w1(func):
    def inner(*args,**kwargs):
        # 验证1
        # 验证2
        # 验证3
        return func(*args,**kwargs)
    return inner
 
def w2(func):
    def inner(*args,**kwargs):
        # 验证1
        # 验证2
        # 验证3
        return func(*args,**kwargs)
    return inner
 
 
@w1
@w2
def f1(arg1,arg2,arg3):
    print 'f1'

问题:更厉害的装饰器?如下:事前装饰+函数+事后装饰

def Before(request,kargs):
    print 'before'
      
def After(request,kargs):
    print 'after'
  
def Filter(before_func,after_func):
    def outer(main_func):
        def wrapper(request,kargs):
              
            before_result = before_func(request,kargs)
            if(before_result != None):
                return before_result;
              
            main_result = main_func(request,kargs)
            if(main_result != None):
                return main_result;
              
            after_result = after_func(request,kargs)
            if(after_result != None):
                return after_result;
              
        return wrapper
    return outer
      
@Filter(Before, After)
def Index(request,kargs):
    print 'index'

用一张图来解释语句的执行顺序,如下:

上述的装饰器虽然已经完成了其应有的功能,即:装饰器内的函数代指了原函数,注意其只是代指而非相等,原函数的元信息没有被赋值到装饰器函数内部。例如:函数的注释信息
如果使用@functools.wraps装饰装饰器内的函数,那么就会代指元信息和函数。如下:
def outer(func):
    @functools.wraps(func)
    def inner(*args, **kwargs):
        print(inner.__doc__)  # None
        return func()
    return inner

@outer
def function():
    """
    asdfasd
    :return:
    """
    print('func')


原文地址:https://www.cnblogs.com/huamingao/p/5888037.html