python之裝飾器

來源:互聯網
上載者:User

標籤:通過   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之裝飾器

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.