帶參數的裝飾器
可是,本人在最近的工做學習中遇到了一些坑,所以又返回頭去從新學習並練習了下,下面就用一個例子來講明一下帶參數裝飾器
的簡單使用。
基於帶參數裝飾器的簡單登錄:
先上代碼:
def outer(type):
def inner(func):
def wrapper():
if type == 'usual':
username = input('用戶名:').strip()
password = input('密碼:').strip()
if username == 'whw' and password == '123':
print('%s 登錄成功'%func.__name__)
func()
else:
print('%s 登錄失敗'%func.__name__)
elif type == 'super':
print('welcome super func!')
func()
return wrapper
return inner
@outer('usual')
def func_usual():
print('普通玩家...')
@outer('super')
def func_super():
print('付費玩家...')
if __name__ == '__main__':
func_usual()
print('**********')
func_super()
上面代碼實現的效果是:「超級函數」不用進行認證便可執行,「普通函數」須要認證後才能執行。
咱們能夠這樣理解:在定義裝飾器函數outer時,咱們先賦予他一種外在的「氣質」(也就是他帶的參數type),若是他的這個「氣質」是「吊絲」——usual,那就在內層的執行函數wrapper裏爲他設置「門檻」;固然若是人家是付費用戶,固然能夠隨心所欲,直接「do as you want~」。對於第二層inner函數,它攜帶的是具體函數的內存地址,咱們能夠理解它是程序的發放者,當知足條件後能夠在對應的地方加上()執行——固然根據需求也能夠不執行外面的函數。
最後提醒你們,無論是帶參數的裝飾器仍是不帶參數的裝飾器,寫法都是很固定的,但願你們多加練習,只有多練才能提高本身的理解,不要眼高手低,致使沒必要要的小bug的發生!
最後上運行結果: