標籤:__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——裝飾器(兩種不同的使用情境)