python 实现带参数的装饰器

时间:2022-02-11 22:27:15
# coding:utf8
__author__ = 'bluesli'

def before(request,kwarg):
    print('before')

def after(request,kwarg):
    print('after')

def Filter(before_fun,after_fun):
    def outer(main_fun):
        def wrapper(request,kwarg):
            before_ret = before_fun(request,kwarg)
            if before_ret!=None:
                return before_ret

            afrer_ret = after_fun(request, kwarg)
            if afrer_ret != None:
                return afrer_ret

            main_ret = main_fun(request, kwarg)
            if afrer_ret != None:
                return main_ret
        return wrapper
    return outer

@Filter(before,after)
def index(request,kwarg):
    print('index')

index('ll','kk')
 

执行过程:

 

4:(带参数的装饰器)装饰器本身就会将被装饰的函数作为参数传入,如果我们自己定义函数再从新作为参数时怎么辨别?:
步骤:执行filter函数2:生成outer即@outer, 最后又将被装饰函数复制成新的函数,执行新的需求;
原理就是:在装饰器的基础之上,进一步再向装饰器传参数;

复杂的装饰器很少用到,但是这是一种框架的思想,无需考虑实现的过程,只需要具体实现功能的函数;