学习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)
下一篇: 微信支付和微信支付通知基于sdk的说明