有参装饰器

有参装饰器:

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 == "yulinqq" and pwd == "123":  # qq
                        login_dic["flag"] = True
                        login_dic["username"] = user
                        func(*args, **kwargs)
                    else:
                        print("用户名或密码错误!")

            		elif argv == "微信":
                		user = input("username:")
               			pwd = input("password:")
                		if user == "yulinvx" and pwd == "123":  # 微信
                    		login_dic["flag"] = True
                    		login_dic["username"] = user
                    		func(*args, **kwargs)
                		else:
                    		print("用户名或密码错误!")

            		elif argv == "抖音":
                		user = input("username:")
                		pwd = input("password:")
                		if user == "yulindy" and pwd == "123":  # 抖音
                    		login_dic["flag"] = True
                    		login_dic["username"] = user
                    		func(*args, **kwargs)
                		else:
                    		print("用户名或密码错误!")

            		else:
                		user = input("username:")
                		pwd = input("password:")
                		if user == "yulin@qq.com" and pwd == "123":  # 邮箱
                    		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
}

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 == "yulinqq" and pwd == "123":  # 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 == "yulinvx" and pwd == "123":  # 微信
                        login_dic["flag"] = True
                        login_dic["username"] = user
                        func(*args, **kwargs)
                    else:
                        print("用户名或密码错误!")
                elif argv == "抖音":
                    print("欢迎登陆抖音")
                    user = input("username:")
                    pwd = input("password:")
                    if user == "yulindy" and pwd == "123":  # 抖音
                        login_dic["flag"] = True
                        login_dic["username"] = user
                        func(*args, **kwargs)
                    else:
                        print("用户名或密码错误!")
                else:
                    print("欢迎登陆邮箱")
                    user = input("username:")
                    pwd = input("password:")
                    if user == "yulin@qq.com" and pwd == "123":  # 邮箱
                        login_dic["flag"] = True
                        login_dic["username"] = user
                        func(*args, **kwargs)
                    else:
                        print("用户名或密码错误!")

        return inner
    
    return wrapper

msg = """
qq
微信
抖音
邮箱
请输入您要选择登陆的APP:
"""
chose = input(msg).lower()


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

foo()
'''
@auth(chose) 等同于以下两行代码的解构
wrapper = auth(chose)
foo = wrapper(foo)
'''
posted @ 2020-10-27 09:54  Ylinn  阅读(118)  评论(0)    收藏  举报