zoukankan      html  css  js  c++  java
  • 叠加多个装饰器

    加载装饰器就是将原函数名偷梁换柱成了装饰器最外层那个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('psaaword:').strip()
                if engine == 'file':
                    print('基于文件的认证')
                    if name =='egon' and pwd =='123':
                        print('successfull')
                        res=func(*args,**kwargs)
                        return res
                elif engine == 'mysql'
                    print('基于mysql的认证')
                elif engine == 'ldap'
                    print('基于ldap的认证')
                else:
                    print('错误的认证源')
            return wrapper2
        return xxx
    
    @timmer#index=timmer(wrapper2的内存地址)#index=wrapper1的内存地址
    @auth(engine='file') #@xxx#index=xxx(最原始那个index的内存地址)#index=wrapper2的内存地址
    def index():
        print('welcome to index page')
        time.sleep(2)
    
    index()#wrapper1的内存地址()
    '''
  • 相关阅读:
    phpStudy The requested URL /web/index.php was not found on this server
    python yield 理解与用法
    python 高阶函数之 map
    python 高阶函数之 reduce
    java extends和implements区别
    SpringMVC中使用Interceptor拦截器顺序
    SpringMVC 拦截器使用说明
    java session创建与获取
    跨域解决方案
    nrm -- 一键切换npm源
  • 原文地址:https://www.cnblogs.com/xiamenghan/p/9720569.html
Copyright © 2011-2022 走看看