zoukankan      html  css  js  c++  java
  • 有参装饰器 多个装饰器装饰一个

    1.有参装饰器

    基本版

    def auth(argv):
        def wrapper(f):
            def inner(*args,**kwargs):
                f(*args,**kwargs)
            return inner
        return wrapper
    

    示例:

    login_dic = {"username": None, "flag": False}
    msg = """请选择app:
    QQ
    微信
    抖音
    邮箱
    """
    
    chose = input(msg).upper()
    def auth(argv):
        def wrapper(f):
            def inner(*args,**kwargs):
                if login_dic["flag"]:
                    f(*args,**kwargs)
                else:
                    if argv == "QQ":
                        print("欢迎登陆QQ")
                        user = input("请输入账号:")
                        password = input("请输入密码:")
                        if user == "alex" and password == "alex123":
                            login_dic["flag"] = True
                            login_dic["username"] = user
                            f(*args,**kwargs)
                        else:
                            print("账号或者密码错误")
                    elif argv == "微信":
                        print("欢迎登陆微信")
                        user = input("请输入账号:")
                        password = input("请输入密码:")
                        if user == "alex123" and password == "alex123456":
                            login_dic["flag"] = True
                            login_dic["username"] = user
                            f(*args, **kwargs)
                        else:
                            print("账号或者密码错误")
                    elif argv == "抖音":
                        print("欢迎登陆抖音")
                        user = input("请输入账号:")
                        password = input("请输入密码:")
                        if user == "alex456" and password == "alex456123":
                            login_dic["flag"] = True
                            login_dic["username"] = user
                            f(*args, **kwargs)
                        else:
                            print("账号或者密码错误")
                    else:
                        print("欢迎登陆邮箱")
                        user = input("请输入账号:")
                        password = input("请输入密码:")
                        if user == "alex@qq.com" and password == "alex123":
                            login_dic["flag"] = True
                            login_dic["username"] = user
                            f(*args, **kwargs)
                        else:
                            print("账号或者密码错误")
            return inner
        return wrapper
    
    @auth(chose)
    def foo():
        print("这是一个被装饰的函数")
    foo()
    
    # @auth(chose) 相等于以下两行代码的解构
    # wrapper = auth(chose)
    # foo = wrapper(foo)
    

    2.多个装饰器装饰一个函数

    def wrapper1(func):
        def inner1(*args,**kwargs):
            print(1)
            func(*args,**kwargs)
            print(11)
        return inner1
    
    def wrapper2(func):
        def inner2(*args,**kwargs):
            print(2)
            func(*args,**kwargs)
            print(22)
        return inner2
    
    def wrapper3(func):
        def inner3(*args,**kwargs):
            print(3)
            func(*args,**kwargs)
            print(33)
        return inner3
    
    @wrapper3
    @wrapper2
    @wrapper1
    def foo():
        print("这是一个被装饰的函数")
    
    foo()
    
    #3
    2
    1
    这是一个被装饰的函数
    11
    22
    33
    
  • 相关阅读:
    centos下tomcat自启动
    navcat12 windows 下载安装
    mysql8 windows 下载安装
    redis windows下载安装
    python json.dumps()函数输出json格式,使用indent参数对json数据格式化输出
    Python的安装图解
    spark入门系列教程二——简单入门实例
    Spark入门系列教程一 —— Spark2.3.1 集群安装
    css在文字两边加线,文字居中效果——实战应用
    a标签中对于邮箱和电话的用法mark
  • 原文地址:https://www.cnblogs.com/beichen123/p/11253054.html
Copyright © 2011-2022 走看看