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('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()
  • 相关阅读:
    java常用类
    java throw和catch同时使用
    HTML5 input 类型: email及url
    Android中集成支付宝
    HTML5 预加载
    SQLite数据库
    Android开发中如何加载API源码帮助开发
    Java中的static
    HTML5 Web Storage 特性
    gdal1.10编译经验
  • 原文地址:https://www.cnblogs.com/msj513/p/9718543.html
Copyright © 2011-2022 走看看