裝飾器二次學習

2022-07-01 01:03:08 字數 3359 閱讀 2647

直接改變模組裡面函式的功能,將login() 引入到已經實現**功能的模組裡,不符合開放封閉原則。

user_status = false    #全域性變數user_status,預設為false,如果使用者登入成功,則修改為true,不用再登入。

def login():

user = "alex"

password = "123"

global user_status #這樣就可以修改全域性變數

if user_status == false: # 如果使用者處於未登陸的狀況,讓使用者進行登入。

user = input("使用者名稱:")

password = input("密碼:")

if user == "alex"and password == "123":

print("歡迎登陸")

user_status = true

else:

print("您輸的密碼不正確,請重新輸入")

else:

print("使用者已登入,驗證通過")

def home():

print("----主頁----")

def america():

login()

print("----歐美專區----") #需要登入才能進入進入歐美專區

def japan():

print("----日本專區----")

def henan():

login() #不符合開發的開放-封閉原則。封閉:已經實現功能的**塊不能被修改。開放:**塊只能被擴充套件。

print("----河南專區----")

已經實現功能的**塊,只能被擴充套件,不能被修改。下面的**實現了擴充套件,也實現了功能。但是還是存在著問題。

下面的**改變了呼叫方式,用login呼叫henan等,如果存在多個模組,且別人用其他方式呼叫了河南,那麼就需要全部修改為用login呼叫。

user_status = false

def login(func): #將func函式作為引數傳入到login

user = "alex"

password = "123"

global user_status

if not user_status:

user = input("使用者名稱:")

password = input("密碼:")

if user == "alex"and password == "123":

print("歡迎登陸")

user_status = true

else:

print("您輸入的密碼錯誤,請重新輸入")

if user_status: #使用者已經登入則執行func

func()

def home():

print("----主頁----")

def america():

print("----歐美專區----")

def japan():

print("----日本專區----")

def henan():

print("----河南專區----")

login(henan)

login裡巢狀乙個inner函式,並且返回inner函式的位址。這樣就不會直接執行login() 

user_status = false

def login(func): #func是要傳入的函式的記憶體位址

def inner():

user = "alex"

password = "123"

global user_status

if not user_status:

user = input("使用者名稱:")

password = input("密碼:")

if user == "alex"and password == "123":

print("歡迎登陸")

user_status = true

else:

print("您輸入的密碼錯誤,請重新輸入")

if user_status:

func() #執行執行要傳入的函式。

return inner

def home():

print("----主頁----")

def america():

print("----歐美專區----")

def japan():

print("----日本專區----")

def henan():

print("----河南專區----")

henan = login(henan) #賦值操作從右到左,執行login時先將 原henan當引數帶入,並且最後返回inner,也就是新henan(新henan其實就是inner的記憶體位址)。

henan()        在原henan帶入到login時,已經將原henan封包了,這樣henan呼叫時最後的結果還是原henan。

裝飾器:在符合開放—封閉原則的同時,給**新增新功能。

user_status = false

def login(func): #func是要傳入的函式的記憶體位址

def inner():

user = "alex"

password = "123"

global user_status

if not user_status:

user = input("使用者名稱:")

password = input("密碼:")

if user == "alex"and password == "123":

print("歡迎登陸")

user_status = true

else:

print("您輸入的密碼錯誤,請重新輸入")

if user_status:

func() #執行執行要傳入的函式。

return inner

def home():

print("----主頁----")

def america():

print("----歐美專區----")

@login #在需要呼叫的函式上面新增@login,login就會把該函式傳入到形參。等同於 japan=login(japan)

def japan():

print("----日本專區----")

@login

def henan():

print("----河南專區----")

america()

henan()

二次學習動態規劃

最近在看一本經典的程式設計師書籍 程式設計之美 裡面有一道買書的演算法題,書中指導使用動態規劃去解決該問題,雖然一年前有那麼幾天看似深入的學習了一下動態規劃,但這次看完書上的解釋之後還是不太清楚如何寫 去解決買書問題,所以用文章的方式再次記錄一遍自己學習動態規劃與解決買書問題的過程。動態規劃是通過把...

二次剩餘學習小記

這個其實很早之前就想寫了,只不過一直沒有時間。之前稍微學了一下,但由於沒有留下深刻的印象,所以學了等於白學。scoi2018有一道題就是裸的二次剩餘題,比賽時做不出來真是氣炸了。如果p pp為奇素數。n nn在模p pp意義下能被開方,就稱n nn是模p pp意義下的二次剩餘。即存在x2 n mo ...

Python第二次學習

轉義字元 格式化 format 對數字進行格式化 內建函式 判斷 一般以is開頭 操作類函式 常見操作 切片 l1 1 6 新增 insert 位置,元素 在指定位置插入資料 合併list1.extend list2 將list2 拼接到list1後 刪除 更改 查詢 遍歷 排序 反轉 複製x nu...