python装饰器

python装饰器就是对已有函数的功能扩展.

 
简单装饰器
 
def w1(func):
def inner():
print('%s is running' % func.__name__)
return func()
return inner
 
@w1
def show():
print('show')
 
show()
 
上面的@是装饰器的语法糖,在定义函数的时候使用,避免再一次赋值.
上面带有装饰器的代码执行了一下步骤:
@w1有以下功能
1.将被装饰函数的函数名作为参数,运行def w1(show)函数
2.w1的函数返回值inner赋值给show,此时show = inner
开始执行show()
1.由于show = inner,所以执行show()会切入装饰器内部执行inner()函数,
2.inner()函数return show() 再执行被装饰的函数show()函数
 
带参数的装饰器
 
ef 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'

Index()

 

1.@Filter(Before, After) 这个首先执行Filter(Before, After)函数,然后返回一个装饰器outer

2.这样@Filter(Before, After)就等于@Outer

3.@outer把下面被装饰的Index()函数名作为参数运行outer(Index)

4.得到的返回值wrapper复制给Index()

5.开始执行最下面的Index()语句,由于Index被复制成为了wrapper,所以等于运行了wrapper,于是切入装饰器内部,开始执行wrapper函数.

6.wrapper函数内部再根据条件执行Before, main,以及After函数.
 
posted @ 2017-03-01 12:45  jack410  阅读(189)  评论(0编辑  收藏  举报