1. 程式人生 > >Python-23_裝飾器-04_練習---無參裝飾器、有參裝飾器

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()
問題:呼叫一個函式 要輸入一次驗證,呼叫一個函式 要輸入一次驗證,不正常
解決:第一登陸後,儲存狀態,以供後續函式使用(定義一個全域性變數)