参考:
装饰器 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')