首先應(yīng)該理解裝飾器的原理是什么以及為什么使用裝飾器傅联?其實主要就是兩個特性:
a、不改變原函數(shù)的內(nèi)部結(jié)構(gòu)和執(zhí)行方式
b巡验、為原函數(shù)增加功能
比如你現(xiàn)在有一個home函數(shù)损离,客戶需要訪問home頁面,執(zhí)行home()禁谦,返回到home頁面,但是正常情況下我們需要檢查客戶是否已經(jīng)登錄胁黑,如果已經(jīng)登錄就直接回復(fù)home頁面,如果沒有登錄就需要返回到登錄頁面州泊,解決方式有兩種:1丧蘸、修改home函數(shù),在函數(shù)內(nèi)部做判斷拥诡,但是這樣其他人調(diào)用home函數(shù)就可能出現(xiàn)問題触趴,2氮发、使用裝飾器,判斷是否已經(jīng)登錄冗懦,在其他的頁面也需要用到爽冕,比如首頁也可以,這樣利用率很高
1披蕉、不帶參數(shù)的裝飾器
def login(func):
def wrapper(*args, **kwargs):
print('do something')
return func(*args, **kwargs)
return wrapper
@login
def funcB(name):
print('my name is {}'.format(name))
if __name__ == '__main__':
funcB('alex')
運行結(jié)果是:
do something
my name is alex
其實這個裝飾器的本質(zhì)就是a=login(funcB),然后執(zhí)行a('alex')颈畸,a是一個變量,此時我們也可以用原函數(shù)名funcB代替a没讲,同樣也是執(zhí)行原函數(shù)眯娱,如下:
def login(func):
def wrapper(*args, **kwargs):
print('do something')
return func(*args, **kwargs)
return wrapper
def funcB(name):
print('my name is {}'.format(name))
if __name__ == '__main__':
funcB=login(funcB)
funcB('alex')
運行結(jié)果:
do something
my name is alex
兩種方式運行結(jié)果一樣,為了方便爬凑,一般就使用到了裝飾器@func這種寫法徙缴,調(diào)用的時候直接執(zhí)行原函數(shù)即可
2、帶參數(shù)的裝飾器
def with_param(age):
def funA(func):
def wrapper(*args,**kwargs):
if len(*args):
return func(*args, **kwargs)
print('你的token是空的嘁信,請重新登錄')
return wrapper
return funA
@with_param(18)
def home(token):
print('歡迎來到home于样,my token is {}'.format(token))
@with_param(16)
def index(token):
print('歡迎來到首頁潘靖,my token is {}'.format(token))
if __name__ == '__main__':
home('agkdgaks')
home('')
index('dakgdjgahdfjya')
index('')
運行結(jié)果:
歡迎來到home穿剖,my token is agkdgaks
你的token是空的,請重新登錄
歡迎來到首頁卦溢,my token is dakgdjgahdfjya
你的token是空的单寂,請重新登錄