叠加多个装饰器的执行原理

加载装饰器就是将原函数名偷梁换柱成了装饰器最内层哪个wrapper函数

在加载完毕后,在调用原函数其实就是在调用wrapper函数

当一个被装饰的对象同时叠加多个装饰器时,

装饰器的加载顺序是,自下从上

装饰器内wrapper函数的执行顺序是,自上而下。

import time

def timmer(func): #func=wrapper2的内存地址
    def wrapper1(*args, **kwargs):
        print('===================================>wrapper1运行了')
        start=time.time()
        res = func(*args, **kwargs) #===========================>跳到wrapper2去执行了,
        stop=time.time()
        print('run time is %s' %(stop - start))
        return res
    return wrapper1

def auth(engine='file'):
    def xxx(func): # func=最原始那个index的内存地址
        def wrapper2(*args, **kwargs):
            print('===================================>wrapper2运行了')
            name=input('username>>>: ').strip()
            pwd=input('password>>>: ').strip()
            if engine == 'file':
                print('基于文件的认证')
                if name == 'egon' and pwd  == '123':
                    print('login successfull')
                    res = func(*args, **kwargs)
                    return res
            elif engine == 'mysql':
                print('基于mysql的认证')
            elif engine == 'ldap':
                print('基于ldap的认证')
            else:
                print('错误的认证源')
        return wrapper2
    return xxx

@auth(engine='file')
@timmer
def index():
    print('welcome to index page')
    time.sleep(2)

index()

猜你喜欢

转载自www.cnblogs.com/msj513/p/9718543.html