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()
  • 相关阅读:
    redis持久化RDB与AOF
    oracle PL/SQL习题
    pl/sql中的三种循环
    转 Oracle Cursor用法总结
    Oracle与MySQL的SQL语句区别
    安装mysql 遇到最后一步卡死解决方案
    Oracle安装
    mysql安装
    sql语句的优先级
    MVC设计模式
  • 原文地址:https://www.cnblogs.com/msj513/p/9718543.html
Copyright © 2011-2022 走看看