博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装饰器叠加和有参装饰器
阅读量:6937 次
发布时间:2019-06-27

本文共 2326 字,大约阅读时间需要 7 分钟。

叠加多个装饰器

  • 叠加多个装饰器

    1. 加载顺序(outer函数的调用顺序):自下而上

    2. 执行顺序(wrapper函数的调用顺序):从上到下

      # 叠加多个装饰器# 1. 加载顺序(outter函数的调用顺序):自下而上# 2. 执行顺序(wrapper函数的执行顺序):自上而下​​def outter1(func1): #func1=wrapper2的内存地址    print('加载了outter1')    def wrapper1(*args,**kwargs):        print('执行了wrapper1')        res1=func1(*args,**kwargs)        return res1    return wrapper1​def outter2(func2): #func2=wrapper3的内存地址    print('加载了outter2')    def wrapper2(*args,**kwargs):        print('执行了wrapper2')        res2=func2(*args,**kwargs)        return res2    return wrapper2​def outter3(func3): # func3=最原始的那个index的内存地址    print('加载了outter3')    def wrapper3(*args,**kwargs):        print('执行了wrapper3')        res3=func3(*args,**kwargs)        return res3    return wrapper3​​​@outter1 # outter1(wrapper2的内存地址)======>index=wrapper1的内存地址@outter2 # outter2(wrapper3的内存地址)======>wrapper2的内存地址@outter3 # outter3(最原始的那个index的内存地址)===>wrapper3的内存地址def index():    print('from index')​print('======================================================')index()

       

有参装饰器

  • 应用场景:当装饰器函数内除要传入被装饰对象外还要传入其他参数时,就需要用到有参装饰器。

    # 实现一个基于函数验证的装饰器,其后台数据存 放方式有多种​from functools import wrapstag = 0​def auth(engin):  # 函数用到除func以外函数,故再套一层函数    def outer(func):        @wraps(func)  # wraps函数,相当是一个装饰器将原始被装饰对象的name、和注释传给了wrapper函数        def wrapper(*args,**kwargs):            global tag  # 全局声明,要使用全局中的名字            if tag:  # tag 为True 时,即不再需要验证,通过改变全局变量的方式更改tag的值                res = func(*args, **kwargs)                return res            name = input('username:').strip()            pwd = input('password:').strip()            if engin =='file':                if name == 'jason' and pwd == '123':                    print('login successful !')                    res = func(*args, **kwargs)                    tag = 1  # 将tag变为True                    return res                else:                    print('name or password !')            elif engin =='mysql':                print('执行MySQL认证功能')            elif engin == 'ldap'                print('执行ldap认证功能')            else:                print('输入有误')        return wrapper    return outer        @auth('file')  # engine=file,@outer   # outer = outer(welcome)    # welcome=wrapperdef welcome():    print('welcome to XXX bank !')        @auth('file')def check():    print('查看余额')

     

转载于:https://www.cnblogs.com/liusijun113/p/10942324.html

你可能感兴趣的文章
SharePoint 2013技巧分享系列 - 同步Exchange显示高清用户照片
查看>>
我们为什么从Python转到go?
查看>>
300元成松松写字团10天好基友,值吗?
查看>>
iRedMail邮件系统配置简易视频安装教程
查看>>
内存分配失败捕捉 set_new_handler
查看>>
【Ubuntu技巧】Ubuntu下gedit 打开txt文件乱码的处理方法
查看>>
简明Python3教程 9.函数
查看>>
shell实现随机数多种方法(data,random,uuid)
查看>>
web移动开发最佳实践之css篇
查看>>
Ubuntu下解压缩文件
查看>>
java.io.IOException: Unable to open sync connection!
查看>>
Android学习之路十一:Activity
查看>>
poj 1185 炮兵布阵
查看>>
MySQL与Oracle的语法区别
查看>>
基础果然要牢记(一次失败的电面)
查看>>
suds 0.4 : Python Package Index
查看>>
Oracle等待事件:NULL EVENT
查看>>
OTN中文技术论坛清净的ORACLE讨论之地
查看>>
ADFS 2.0安装设置心得
查看>>
Zend Framework学习之过滤器Zend_Filter
查看>>