python的學習之路day5
阿新 • • 發佈:2017-12-23
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("請登錄")v1return 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()
輸出:
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