Python 装饰器:
装饰器(decorator)是一种高级Python语法
顾名思义, 装饰器是用来装饰已经存在的函数,这个存在的函数已经实现了某些功能,而且这个函数不能被修改的情况下,想对这个函数的功能进行扩展。
这个时候就需要用到装饰器。
例如需要在函数运行前后打印一条日志, 但是又不希望或者没有权限修改函数内部的结构, 就可以用到装饰器(decorator):
一、简单装饰器:
希望在调用某个功能函数之前进行验证:
def login(main_func): # 定义装饰器函数 def inner(request,kargs): print(‘Logon‘) main(request,kargs) return inner @login def show(request,kargs): # 功能函数,不能修改 print(‘show‘)
装饰器接收一个可调用对象作为输入参数,在装饰器函数里面又定义了一个新的函数inner(), 在inner()中写入验证的代码,验证成功之后再调用我们的功能函数Show()
当程序运行到@login时,相当于是运行show = login(show)其实是进行了两个步骤:
1.调用这个装饰器函数时,因为在函数里面还定义了一层函数,暂时不执行第二层的函数,而是直接return 第二层函数对象inner.
2. 把装饰器函数的return值也就是inner函数指向给变量show
当调用show(), 其实是先执行inner函数中的语句,打印‘Logon‘ 再执行原来的show()功能函数。
通过这个装饰器达到扩功能的目的。
注: @login是 Python 语法糖的用法, 相当于 func = login(func)
二、带参数的装饰器
大家都知道函数是可以带参数的。 装饰器也是个函数, 那装饰器可不可以带参数呢。 例如调用的时候是这样的写法@login(*kargs, **wkargs)
示例代码如下:
def login(request, kargs):
print(‘befor‘)
def error_handle(request,kargs):
print(‘after‘)
def w1(before_func, after_func):
def outer(main_func):
def wapper(request, kargs):
before_func(request, kargs)
main_func(request, kargs)
after_func(request, kargs)
return wapper
return outer
@w1(login, error_handle)
def index(request, kargs):
print(‘index‘)
带参数的装饰器的运行顺序如下:
在遇到@w1(login, error_handle),先执行 w1(login, error_handle)函数。该函数的返回值是outer 那其实就是@outer
这样的执行顺序就和上文的简单装饰器的运行原理一致。
原文:http://www.cnblogs.com/leoli-keeplearning/p/5197575.html