• 带参数的装饰器,装饰器装饰多个函数


    带参数的装饰器

    装饰器其实就是一个闭包函数,就是两层的函数,就应该具有函数传参功能。

    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 == '111' 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 == '111' 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 == '111' and password == '123':
                    login_status['status'] = True
                    ret = func()
                    return ret
            elif 'qq':
                username = input('请输入用户名:').strip()
                password = input('请输入密码:').strip()
                if username == '111' 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 == '111' and password == '123':
                        login_status['status'] = True
                        ret = func()
                        return ret
                elif x == 'qq':
                    username = input('请输入用户名:').strip()
                    password = input('请输入密码:').strip()
                    if username == '111' 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 然后在依次执行。这样就是带参数的装饰器,参数可以传入多个。

    装饰器装饰多个函数

    多个装饰器装饰一个函数:

    def wrapper1(func):
        def inner1(*args,**kwargs):
            print("这是装饰器一开始")
            func(*args,**kwargs)
            print("这是装饰器一结束")
        return inner1
    
    def wrapper2(func):  
        def inner2(*args,**kwargs):
            print("这是装饰器二开始")
            func(*args,**kwargs)
            print("这是装饰器二结束")
        return inner2
    
    
    @wrapper1  
    @wrapper2  
    def func():
        print("这是被装饰的函数")
    
    func()
    

    打印结果:

    这是装饰器一开始
    这是装饰器二开始
    这是被装饰的函数
    这是装饰器二结束
    这是装饰器一结束
    

    Python规定多个装饰器装饰一个函数的时候先执行离被装饰的函数最近的装饰器

  • 相关阅读:
    VMware ESXI 5.5 注册码
    NetScaler Active-Active模式
    Citrix NetScaler HA(高可用性)解析
    服务管理--systemctl命令
    CentOS7 安装 webgoat 7.1 简介
    Codefoces 723B Text Document Analysis
    Codefoces 723A The New Year: Meeting Friends
    ECJTUACM16 Winter vacation training #1 题解&源码
    信息学奥赛一本通算法(C++版)基础算法:高精度计算
    从零开始学算法:高精度计算
  • 原文地址:https://www.cnblogs.com/sundawei7/p/11238893.html
Copyright © 2020-2023  润新知