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的内存地址()
    '''
  • 相关阅读:
    C#生成图形验证码
    飞刀软件官网正式开通
    IIS7或者IIS7.5部署MVC项目时出现404错误
    office编程必不可少 [转]
    C# 利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站
    console方便用法
    24个解决实际问题的ES6代码段
    遍历对象的属性和对象的值
    前端图片处理
    Vue团队代码规范
  • 原文地址:https://www.cnblogs.com/xiamenghan/p/9720569.html
Copyright © 2011-2022 走看看