標籤:通過 ret 進階 png 調用 src ali 功能 種類型
裝飾器
裝飾器:今天我們來瞭解一下裝飾器是什嗎?裝飾器是什麼,從名字上來看,是一個起裝飾作用的機器。那麼在python中,我們的裝飾器又是什麼呢?在python中裝飾器是用來修改我們原來函數中的各種功能的,那麼它與直接修改代碼之間有什麼區別呢?
這裡我們來說說編程的一些禁忌:已經上線的代碼盡量不能修改,且調用方式不能改變(個人解釋。。。)。那麼我們的裝飾器就應運而生了,在python中,裝飾器就是在不修改函數原代碼,以及函數的調用方式的情況下,實現對函數的拓展。
這裡對於裝飾器,我們要理解這幾點:
1.函數即"變數"
2.高階函數
3.嵌套函數
這裡展示一個具體的裝飾器執行個體
user_status = Falsedef login(func): ‘‘‘使用者驗證介面‘‘‘ def inner(*args,**kwargs): _username = ‘Marvelous‘ _password = ‘zxq64289050‘ global user_status if user_status == False: username = input("帳號:").strip() password = input("密碼:").strip() if _username == username and _password == password: print("驗證成功!") user_status = True#驗證成功後執行原來的函數 else: print("輸入錯誤請重試") if user_status: func(*args,**kwargs)#驗證成功之後在這裡就執行lol() return inner#進入第一層函數返回inner的記憶體位址#**kwargs 輸入的是 ‘name‘ = ‘Marvelous‘這種類型的資料@logindef lol(name): ‘‘‘英雄聯盟歡迎介面‘‘‘ print("歡迎來到英雄聯盟!",name)
這裡@login是裝飾器的用法,相當於 lol = login(lol)
這裡再加一張流程的分析圖:
在這裡,我們裝飾器主要運用了嵌套函數和進階函數的知識,我們通過最外層的函數實現了lol = login(lol)來返回內層函數的記憶體位址,這個時候我們已經實現了調用方式從login()到lol()的轉變了,要實現實質性的轉變,這時候我們返回的內層函數的記憶體位址就要起效果了。這時候我們的程式開始在內層函數中走,如果帳號密碼正確,我們就可以執行func(),又因為我們外層函數傳入參數的時候func = lol了,所以這個時候執行的便是我們的lol()了。按照這個程式的內容,這個時候我們就可以登陸"英雄聯盟"啦!
帶參數的裝飾器如果要實現帶參數的裝飾器,我們就可以繼續在外層函數套一層函數來實現。性質與上面類似,具體代碼如下:
user_status = Falsedef login(auth_type): ‘‘‘使用者驗證介面‘‘‘ def outer(func): def inner(*args,**kwargs): _username = ‘Marvelous‘ _password = ‘zxq64289050‘ global user_status if user_status == False: username = input("帳號:").strip() password = input("密碼:").strip() if _username == username and _password == password: print("驗證成功!") user_status = True#驗證成功後執行原來的函數 else: print("輸入錯誤請重試") if user_status: func(*args,**kwargs)#驗證成功之後在這裡就執行lol() return inner#進入第一層函數返回inner的記憶體位址 return outer#**kwargs 輸入的是 ‘name‘ = ‘Marvelous‘這種類型的資料@login(‘qq‘)def lol(name): ‘‘‘英雄聯盟歡迎介面‘‘‘ print("歡迎來到英雄聯盟!",name)
python之裝飾器