一段代碼帶你理解「帶參數的裝飾器」

帶參數的裝飾器

關於裝飾器的理解及調用過程請看我以前的博客:http://www.javashuo.com/article/p-wrzjwawd-cw.html
可是,本人在最近的工做學習中遇到了一些坑,所以又返回頭去從新學習並練習了下,下面就用一個例子來講明一下帶參數裝飾器的簡單使用。

基於帶參數裝飾器的簡單登錄:

先上代碼:
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的發生!
最後上運行結果:

相關文章
相關標籤/搜索