Python-23_装饰器-04_练习---无参装饰器、有参装饰器
一、无参装饰器:
京东后端程序简写,并加上验证功能:
编写一个装饰器,提供验证功能:
# 用户信息表: user_list=[ {'name':'new1','passwd':'123'}, {'name':'new2','passwd':'123'}, {'name':'new3','passwd':'123'}, {'name':'new4','passwd':'123'}, ] dic = {"username": None, "login": False} # 定义一个全局变量 记录当前用户的状态 def verify(func): def foo(*args, **kwargs): if dic["username"] and dic["login"]: # 判断:如果全局变量存在,执行这一步 res = func(*args, **kwargs) return res username = input("用户名:").strip() password = input("密码:").strip() for user_dic in user_list: if username == user_dic["name"] and password == user_dic["passwd"]: dic["username"]=username # 全局变量重新赋值 dic["login"]=True res = func(*args, **kwargs) return res else: print("用户名或密码错误") return foo # 1、定义欢迎进入京东界面: @verify def index(): print("欢迎光临京东购物") return "请尽情放纵吧!!" # 2、定义购物车: @verify def shopping_cart(product): print("这是您所想购买的物品 %s,如有需要,清下单哦" % product) # 3、定义订单信息: @verify def order(): print("这是你以下订单详细信息") res = index() print(res) shopping_cart("奶茶") order()
问题:调用一个函数 要输入一次验证,调用一个函数 要输入一次验证,不正常
解决:第一登陆后,保存状态,以供后续函数使用(定义一个全局变量)
二、有参装饰器:
# 用户信息表: user_list=[ {'name':'new1','passwd':'123'}, {'name':'new2','passwd':'123'}, {'name':'new3','passwd':'123'}, {'name':'new4','passwd':'123'}, ] dic = {"username": None, "login": False} # 定义一个全局变量 记录当前用户的状态 def auth(auth_type="filedb"): # 在原本无参装饰器外、再嵌套一个函数 def verify(func): def foo(*args, **kwargs): print("认证类型",auth_type) if auth_type=="filedb": # 判断认证类型 if dic["username"] and dic["login"]: # 判断:如果全局变量存在,执行这一步 res = func(*args, **kwargs) return res username = input("用户名:").strip() password = input("密码:").strip() for user_dic in user_list: if username == user_dic["name"] and password == user_dic["passwd"]: dic["username"]=username # 全局变量重新赋值 dic["login"]=True res = func(*args, **kwargs) return res else: print("用户名或密码错误") elif auth_type=="1111": print("认证类型是1111,执行此操作") else: print("认证类型是别的种类,执行此操作") res = func(*args, **kwargs) return res return foo return verify # 1、定义欢迎进入京东界面: @auth(auth_type="filedb") # verify = auth(auth_type="filedb")---->@verify def index(): print("欢迎光临京东购物") return "请尽情放纵吧!!" # 2、定义购物车: @auth(auth_type="filedb") def shopping_cart(product): print("这是您所想购买的物品 %s,如有需要,清下单哦" % product) # 3、定义订单信息: @auth(auth_type="1111") def order(): print("这是你以下订单详细信息") res = index() print(res) shopping_cart("奶茶") order()
问题:调用一个函数 要输入一次验证,调用一个函数 要输入一次验证,不正常
解决:第一登陆后,保存状态,以供后续函数使用(定义一个全局变量)