1. 程式人生 > >Python——裝飾器(兩種不同的使用場景)

Python——裝飾器(兩種不同的使用場景)

error juc 決定 mat 通過 增加 使用場景 ttr ora

#例子,通過裝飾器給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 @auth def 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 @auth def 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_decorator def 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——裝飾器(兩種不同的使用場景)