python学习【五】 装饰器补充
上一篇中已经对装饰器做了简单的介绍,本片主要从装饰器的执行过程来对装饰器做进一步的补充。
两层装饰器
base.py代码如下:
# 验证用户名和密码
def login(name, passwd):
if name == 'andy' and passwd == '123':
return True
else:
return False
def auth(func): func ==>foo
def inner(*args, **kwargs): # 动态参数
key = kwargs.pop('key')
is_login = login(args[0], key)
if not is_login:
print '非法用户'
temp = func(*args, **kwargs)
return temp
return inner
@auth
def foo(*args):
server_list = [192.168.0.11, 192.168.0.22, 192.168.0.33]
return server_list
通过下面的代码调用foo()函数:
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import base
server_list = base.foo('andy', key='123')
print server_list
整个执行过程如下图所示:

三层装饰器
代码如下:
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)
# 1、执行Filter(Before, After),返回outer,这时有把outer作为一个装饰器@outer
def Index(request,kargs):
print 'index'
Index(11,22)
上面代码的执行流程如下图:

通过上面对装饰器的介绍,最终装饰器总结如下:
1.装饰器是一个函数
2. 执行auth_login 函数,被装饰的函数作为参数auth_login(f1) auth_login 函数的返回值,
赋值给被装饰的函数的函数名
@auth_login
def f1():
pass
3.动态参数,可以装饰含有n个参数的函数
4.函数返回值
5.多装饰器
6.至少3层,3层的如何使用?
@auth_login
1.执行auth_login函数
2.将auth_login函数的返回值给赋值给被装饰器的函数的函数名
@auth_login(arg)
1.执行auth_login函数,得到返回值,result
2.创建装饰器,@ + result结合:@result
3...
1).执行result 函数
2).将result函数的返回值给被装饰器的函数的函数名

浙公网安备 33010602011771号