Python——裝飾器(兩種不同的使用場景)
阿新 • • 發佈:2018-01-31
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——裝飾器(兩種不同的使用場景)