1. 程式人生 > >python的學習之路day5

python的學習之路day5

gif else img == 分享 sed 版本 向上 進行

雙層裝飾器

還是老樣,沒有改變:

技術分享圖片
USER_INFO = {}


def check_login(func):
    def inner(*args, **kwargs):
        if USER_INFO.get("is_login", None):
            # 用get方法拿字典裏面的內容,如果字典裏面沒有我們要拿的參數,不會報錯,給他默認返回的為None
            ret = func(*args, **kwargs)
            return ret
        else:
            print("請登錄")

    
return inner def check_admin(func): # 判斷是否為管理員用戶 def inner(*args, **kwargs): if USER_INFO.get("is_login", None): if USER_INFO.get("user_type", None) == 2: # 如果用戶類型等於2,表示為管理員用戶 ret = func(*args, **kwargs) return ret else:
print("無權限查看") # 否者無權限查看 else: print("請登錄") return inner @check_admin def index(): # 超級管理員可以查看 print("index") @check_login def home(): # 登錄可以查看 """ 普通用戶的功能 :return: """ print("home") def login(): # 登錄 user = input("請輸入用戶名:") if user == "
admin": USER_INFO["is_login"] = True USER_INFO["user_type"] = 2 else: # 否者如果不為admin,表示登錄的用戶為普通用戶 USER_INFO["is_login"] = True USER_INFO["is_login"] = 1 def main(): while True: inp = input("1、登錄;2、查看信息;3超級管理員\n>>>") if inp == "1": login() elif inp == "2": home() elif inp == "3": index() main()
v1

輸出:

技術分享圖片
1、登錄;2、查看信息;3超級管理員
>>>2
請登錄
1、登錄;2、查看信息;3超級管理員
>>>3
請登錄
1、登錄;2、查看信息;3超級管理員
>>>1
請輸入用戶名:user
1、登錄;2、查看信息;3超級管理員
>>>2
home
1、登錄;2、查看信息;3超級管理員
>>>3
無權限查看
1、登錄;2、查看信息;3超級管理員
>>>1
請輸入用戶名:admin
1、登錄;2、查看信息;3超級管理員
>>>2
home
1、登錄;2、查看信息;3超級管理員
>>>3
index
1、登錄;2、查看信息;3超級管理員
>>>
v1的輸出

新變化:

技術分享圖片
# 從版本以一中我們可以看到很多我們的check_admin裏面重復了check_login的代碼(check_admin又判斷登錄,又判斷權限),
# 如果我們又加上了超級管理員,那我們就會又寫一個重復的裝飾器,
# 所以我們需要用到雙層裝飾器,先用check_login,判斷是否登錄,然後用check_admin判斷是否為管理員
USER_INFO = {}


def check_login(func):
    def inner(*args, **kwargs):
        if USER_INFO.get("is_login", None):
            # 用get方法拿字典裏面的內容,如果字典裏面沒有我們要拿的參數,不會報錯,給他默認返回的為None
            ret = func(*args, **kwargs)
            return ret
        else:
            print("請登錄")

    return inner


def check_admin(func):  # 判斷是否為管理員用戶
    def inner(*args, **kwargs):
        if USER_INFO.get("user_type", None) == 2:  # 如果用戶類型等於2,表示為管理員用戶
            ret = func(*args, **kwargs)
            return ret
        else:
            print("無權限查看")  # 否者無權限查看

    return inner


# 為什麽check_login寫上面,我們從下向上看,從index()開始,
# 可以看到先用admin裝飾後,比如變成了nindex這個函數,然後再用login裝飾進行裝飾,比如又變成了nnindex,然後python是從上向下執行,
# 所以python會執行nnindex,判斷是否登錄,然後在執行nindex,判斷是否為管理員,如果沒有登錄,
# 提示登錄,如果已經登錄(不為管理員),提示無權限
@check_login
@check_admin
def index():  # 管理員可以查看
    """
    管理員的功能
    :return:
    """
    print("index")


@check_login
def home():  # 登錄可以查看
    """
    普通用戶的功能
    :return:
    """
    print("home")


def login():  # 登錄
    user = input("請輸入用戶名:")
    if user == "admin":
        USER_INFO["is_login"] = True
        USER_INFO["user_type"] = 2
    else:  # 否者如果不為admin,表示登錄的用戶為普通用戶
        USER_INFO["is_login"] = True
        USER_INFO["is_login"] = 1


def main():
    while True:
        inp = input("1、登錄;2、查看信息;3超級管理員\n>>>")
        if inp == "1":
            login()
        elif inp == "2":
            home()
        elif inp == "3":
            index()


main()
v2

輸出:

技術分享圖片
1、登錄;2、查看信息;3超級管理員
>>>2
請登錄
1、登錄;2、查看信息;3超級管理員
>>>3
請登錄
1、登錄;2、查看信息;3超級管理員
>>>1
請輸入用戶名:user
1、登錄;2、查看信息;3超級管理員
>>>2
home
1、登錄;2、查看信息;3超級管理員
>>>3
無權限查看
1、登錄;2、查看信息;3超級管理員
>>>1
請輸入用戶名:admin
1、登錄;2、查看信息;3超級管理員
>>>2
home
1、登錄;2、查看信息;3超級管理員
>>>3
index
1、登錄;2、查看信息;3超級管理員
>>>
v2的輸出

輸出效果完全一樣,註意看v2的註釋

裝飾器的原理(多層原理也一樣):

技術分享圖片

python的學習之路day5