Python-23_裝飾器-04_練習---無參裝飾器、有參裝飾器
阿新 • • 發佈:2018-11-29
一、無參裝飾器:
京東後端程式簡寫,並加上驗證功能:
編寫一個裝飾器,提供驗證功能:
# 使用者資訊表: 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()
問題:呼叫一個函式 要輸入一次驗證,呼叫一個函式 要輸入一次驗證,不正常
解決:第一登陸後,儲存狀態,以供後續函式使用(定義一個全域性變數)