• 第十一天——带参数的装饰器(三)


    一. 带参数的装饰器

    我们看,装饰器其实就是一个闭包函数,再说简单点就是两层的函数。那么是函数,就应该具有函数传参功能。

    login_status = {
        'username': None,
        'status': False,
    }
    

    def auth(func):
    def inner(*args,**kwargs):
    if login_status['status']:
    ret = func()
    return ret
    username = input('请输入用户名:').strip()
    password = input('请输入密码:').strip()
    if username == '太白' and password == '123':
    login_status['status'] = True
    ret = func()
    return ret
    return inner

    你看我上面的装饰器,不要打开,他可以不可在套一层:

    def auth(x):
        def auth2(func):
            def inner(*args,**kwargs):
                if login_status['status']:
                    ret = func()
                    return ret
                username = input('请输入用户名:').strip()
                password = input('请输入密码:').strip()
                if username == '太白' and password == '123':
                    login_status['status'] = True
                    ret = func()
                    return ret
            return inner
        return auth
    

    ​ 举例说明:抖音:绑定的是微信账号密码。 皮皮虾:绑定的是qq的账号密码。 你现在要完成的就是你的装饰器要分情况去判断账号和密码,不同的函数用的账号和密码来源不同。 但是你之前写的装饰器只能接受一个参数就是函数名,所以你写一个可以接受参数的装饰器。

    def auth2(func):
        def inner(*args, **kwargs):
            if login_status['status']:
                ret = func()
                return ret
            if 微信:
                username = input('请输入用户名:').strip()
                password = input('请输入密码:').strip()
                if username == '太白' and password == '123':
                    login_status['status'] = True
                    ret = func()
                    return ret
            elif 'qq':
                username = input('请输入用户名:').strip()
                password = input('请输入密码:').strip()
                if username == '太白' and password == '123':
                    login_status['status'] = True
                    ret = func()
                    return ret
        return inner
    
    @auth2
    def jitter():
        print('记录美好生活')
    
    
    @auth2
    def pipefish():
        print('期待你的内涵神评论')
    

    解决方式:

    def auth(x):
        def auth2(func):
            def inner(*args, **kwargs):
                if login_status['status']:
                    ret = func()
                    return ret
    
                if x == 'wechat':
                    username = input('请输入用户名:').strip()
                    password = input('请输入密码:').strip()
                    if username == '太白' and password == '123':
                        login_status['status'] = True
                        ret = func()
                        return ret
                elif x == 'qq':
                    username = input('请输入用户名:').strip()
                    password = input('请输入密码:').strip()
                    if username == '太白' and password == '123':
                        login_status['status'] = True
                        ret = func()
                        return ret
            return inner
        return auth2
    
    @auth('wechat')  
    def jitter():
        print('记录美好生活')
    
    @auth('qq')
    def pipefish():
        print('期待你的内涵神评论')
    

    @auth('wechat') :分两步:

    第一步先执行auth('wechat')函数,得到返回值auth2

    第二步@与auth2结合,形成装饰器@auth2 然后在依次执行。

    这样就是带参数的装饰器,参数可以传入多个,一般带参数的装饰器在以后的工作中都是给你提供的, 你会用就行,但是自己也一定要会写,面试经常会遇到。

    带参数的装饰器

    有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。 想到与得到中间还有两个字——做到。
  • 相关阅读:
    PHP session
    PHP范例注册审核
    php文件操作
    JSON 弹窗
    PDO
    CSP-S2020 游记
    Meissel-Lehmer算法 学习笔记
    [AGC046C] Shift 题解
    Min_25筛学习笔记
    GDOI2020 游记
  • 原文地址:https://www.cnblogs.com/huoxc/p/12845719.html
Copyright © 2020-2023  润新知