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


    带参数的装饰器

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

    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规定多个装饰器装饰一个函数的时候先执行离被装饰的函数最近的装饰器

  • 相关阅读:
    STL map与Boost unordered_map
    static constructors in C++? need to initialize private static objects
    谈谈C++继承中的重载,覆盖和隐藏
    C++继承:公有,私有,保护
    C++ using关键字作用总结
    ++iter的效率比iter++的效率高
    C++中dynamic_cast,static_cast,const_cast,reinterpret_cast
    【转】WinForm中添加闪屏窗口的两种方法
    【转】一个不错的Matlab的gui界面设计实例 (20081003 15:47:30)matlab gui 界面 校园 分类:Matlab实例
    制作一个WinForm的闪屏
  • 原文地址:https://www.cnblogs.com/sundawei7/p/11238893.html
Copyright © 2020-2023  润新知