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函数的返回值给被装饰器的函数的函数名

 

posted @ 2015-11-26 23:13  杜瑞龙  阅读(125)  评论(0)    收藏  举报