Python——裝飾器(兩種不同的使用情境)

來源:互聯網
上載者:User

標籤:__name__   ret   error   開啟   ...   orm   for   false   支援   

#例子,通過裝飾器給show_name()函數增加驗證功能#version 1 #普通函數不帶參數,裝飾器帶參數def auth(func):    # print(func.__name__) #通過列印這個結果得知,show_name函數被傳入進來了    def auth_decorator(user, pwd):        u = "toby"        p = "1qaz#EDC"        if user == u:            if pwd == p:                print("auth done...")                func() #所以形式參數func等價於show_name()            else:                print("password error")        else:            print("not found user")    return auth_decorator@authdef show_name():    print("my name is toby")show_name("toby","1qaz#EDC")# ##########################################################################################version 2 普通函數和裝飾器都帶參數def auth(func):    # print(func.__name__) #通過列印這個結果得知,show_name函數被傳入進來了    def auth_decorator(name, user, pwd):        u = "toby"        p = "1qaz#EDC"        if user == u:            if pwd == p:                print("auth done...")                func(name) #所以形式參數func等價於show_name()            else:                print("password error")        else:            print("not found user")    return auth_decorator@authdef show_name(name):    print("my name is {0}".format(name))show_name("ttr", "toby","1qaz#EDC")#此時就要把show_name函數看成是show_name(name, user, pwd)這樣,傳三個參數進去# ##########################################################################################version 3 下面的使用的文法,允許動態建立裝飾過的函數對象def auth(func):    # print(func.__name__) #通過列印這個結果得知,show_name函數被傳入進來了    def auth_decorator(user, pwd):        u = "toby"        p = "1qaz#EDC"        if user == u:            if pwd == p:                print("auth done...")                func() #所以形式參數func等價於show_name()            else:                print("password error")        else:            print("not found user")    return auth_decoratordef show_name():    print("my name is juck")#在這個函數中用auth_enable參數來控制是否裝飾show_name函數#auth_enable參數為True,則必須提供user和pwd#也就是說是開啟驗證和關閉驗證由auth_enable來決定def show_name_strengthen(auth_enable=False, u=None, p=None ):    if auth_enable:        s = auth(show_name)        s(u, p)    else:        show_name()#show_name_strengthen()show_name_strengthen(True, "toby", "1qaz#EDC")'''兩種不同的文法,使用情境:    1、文法用@符號來使用裝飾器,這種文法往往用於對不同的函數做永久性的更改    2、這種文法允許我們動態建立裝飾過的函數對象,比如有多個不同功能的裝飾器,    引入判斷條件來使用不同的裝飾器,也就是說可支援多種可選行為'''


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.