欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

学习15.内容#有参装饰器#多个装饰器装饰一个函数

程序员文章站 2022-07-02 13:20:50
有参装饰器 多个装饰器装饰一个函数 ......

有参装饰器

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


login_dic = {
    "username": none,
    "flag": false
}
def auth(argv): # argv == foo
    def wrapper(func):
        def inner(*args,**kwargs):
            if login_dic["flag"]:
                func(*args,**kwargs)
            else:
                if argv == "qq":
                    user = input("username:")
                    pwd = input("password:")
                    if user == "alex" and pwd == "alex123":  # qq
                        login_dic["flag"] = true
                        login_dic["username"] = user
                        func(*args,**kwargs)
                    else:
                        print("用户名或密码错误!")
                elif argv == "微信":
                    user = input("username:")
                    pwd = input("password:")
                    if user == "1351101501" and pwd == "alex":  # 微信
                        login_dic["flag"] = true
                        login_dic["username"] = user
                        func(*args, **kwargs)
                    else:
                        print("用户名或密码错误!")
                elif argv == "抖音":
                    user = input("username:")
                    pwd = input("password:")
                    if user == "alexdsb" and pwd == "alex":  # 抖音
                        login_dic["flag"] = true
                        login_dic["username"] = user
                        func(*args, **kwargs)
                    else:
                        print("用户名或密码错误!")
                else:
                    user = input("username:")
                    pwd = input("password:")
                    if user == "alexdsb@dsb.com" and pwd == "alex":  # 邮箱
                        login_dic["flag"] = true
                        login_dic["username"] = user
                        func(*args, **kwargs)
                    else:
                        print("用户名或密码错误!")

        return inner
    return wrapper

# 错误的案例
@auth # foo = auth(foo)
def foo():
    print("这是一个被装饰的函数")

foo()
login_dic = {
    "username": none,
    "flag": false
}
# 正确的案例
msg = """
qq
微信
抖音
邮箱
请输入您要选择登陆的app:
"""
chose = input(msg).upper()


def auth(argv):
    def wrapper(func):
        def inner(*args, **kwargs):
            if login_dic["flag"]:
                func(*args, **kwargs)
            else:
                if argv == "qq":
                    print("欢迎登陆qq")
                    user = input("username:")
                    pwd = input("password:")
                    if user == "alex" and pwd == "alex123":  # qq
                        login_dic["flag"] = true
                        login_dic["username"] = user
                        func(*args, **kwargs)
                    else:
                        print("用户名或密码错误!")
                elif argv == "微信":
                    print("欢迎登陆微信")
                    user = input("username:")
                    pwd = input("password:")
                    if user == "1351101501" and pwd == "alex":  # 微信
                        login_dic["flag"] = true
                        login_dic["username"] = user
                        func(*args, **kwargs)
                    else:
                        print("用户名或密码错误!")
                elif argv == "抖音":
                    print("来了,老弟!")
                    user = input("username:")
                    pwd = input("password:")
                    if user == "alexdsb" and pwd == "alex":  # 抖音
                        login_dic["flag"] = true
                        login_dic["username"] = user
                        func(*args, **kwargs)
                    else:
                        print("用户名或密码错误!")
                else:
                    print("欢迎登陆dab邮箱")
                    user = input("username:")
                    pwd = input("password:")
                    if user == "alexdsb@dsb.com" and pwd == "alex":  # 邮箱
                        login_dic["flag"] = true
                        login_dic["username"] = user
                        func(*args, **kwargs)
                    else:
                        print("用户名或密码错误!")

        return inner

    return wrapper


@auth("qq")
def foo():
    print("这是一个被装饰的函数")


# wrapper = auth(chose)
# foo = wrapper(foo)
foo()


# @auth(chose) 相等于以下两行代码的解构
# wrapper = auth(chose)
# foo = wrapper(foo)

多个装饰器装饰一个函数

# 被装饰的函数正上方有多个装饰器,先执行离被装饰函数最近的装饰器
def wrapper1(func):
    def inner1(*args, **kwargs):
        print(1)
        func(*args, **kwargs)
        print(11)

    return inner1


def wrapper2(func):  # func == foo
    def inner2(*args, **kwargs):
        func(*args, **kwargs)
        print(22)

    return inner2


def wrapper3(func):
    def inner3(*args, **kwargs):
        print(3)
        func(*args, **kwargs)
        print(33)

    return inner3


@wrapper1  # 1 11
@wrapper3  # 3 33
@wrapper2  # 8 22
def foo():
    print(8)


foo = wrapper2(foo)  # foo == inner2
foo = wrapper3(foo)  # inner3 = wrapper3(inner2)
foo = wrapper1(foo)  # inner1 = wrapper1(inner3)
foo()  # inner1()

foo = wrapper3(foo)  # foo == inner3
foo = wrapper2(foo)  # foo = wrapper2(inner3)  foo == inner2
foo = wrapper1(foo)  # foo = wrapper1(inner2)