python装饰器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()
[email protected](Before, After) 这个首先执行Filter(Before, After)函数,然后返回一个装饰器outer
2.这样@Filter(Before, After)就等于@Outer
[email protected]把下面被装饰的Index()函数名作为参数运行outer(Index)
4.得到的返回值wrapper复制给Index()
5.开始执行最下面的Index()语句,由于Index被复制成为了wrapper,所以等于运行了wrapper,于是切入装饰器内部,开始执行wrapper函数.
6.wrapper函数内部再根据条件执行Before, main,以及After函数.
以上是关于python装饰器的主要内容,如果未能解决你的问题,请参考以下文章