python中的裝飾器

2021-07-22 08:59:12 字數 2598 閱讀 9967

其實去年就開始學python了,零零散散,陸陸續續學了點,期間學習了python web開發,爬蟲系統;但是一些基礎性的知識點長時間不看了就會忘,所以寫個部落格記錄下來,忘了可以隨時檢視,不用回去看**了,希望也能幫助大家學習哈。

python中的裝飾器decorator其實是乙個高階函式,它接受乙個函式作為引數,並返回乙個新的函式,它的執行是由外向內的,**如下

#裝飾器函式

def log(f):

def fn():

print (('call ') + f.__name__ + '()...')

r = f() # 這個函式就是呼叫的 f1()函式

return r #返回f1() 函式的執行結果

return fn

@log #1.自動執行log函式,並且將其下面的函式名f作為引數

def f1():

print('我是函式f1')

f1()

#輸出結果

# call f1()...

# 我是函式f1

我們可以看到上面**執行的是乙個沒有引數的函式,如果函式有引數,並且有多少個引數我們不知道,那該怎麼辦呢?非常好的一點是python裡面提供了萬能引數供我們使用,如果對萬能引數不明白的可以看我的

def log2(f):

def inner(*args,**kwargs): #這2個引數 會接受任意型別的引數

print('before')

r = f(*args,**kwargs)

print('after')

return r

return inner

@log2

def f2(name,age):

print('my name is %s ,i am %s years old'%(name,age))

f2('eric',24)

#輸出# before

# my name is eric ,i am 24 years old

# after

比方說一所中學有乙個夏令營的活動,夏令營有各種活動,但是每個活動對學生的要求不一樣,有的活動要求學生必須滿18歲,有的活動要求學生必須考試分數及格(60),還有的活動必須要求學生2個都滿足,每個活動都可以寫成乙個函式,如果這些要求條件我們都寫成裝飾器的話,就有點太冗餘了,還好就是可以多重裝飾,簡單說就是乙個函式可以有多個裝飾器,**如下

user_info =   # 使用者分數  #使用者年齡

def check_age(f):

def inner(*args,**kwargs):

#檢查年齡 是否滿18

if user_info.get('age',none) >= 18:

r = f(*args,**kwargs) #年齡符合 呼叫方法

return r

else:

print('你還未成年,一邊待著去......')

return inner

def check_score(f):

def inner(*args, **kwargs):

#檢查分數是否合格 60份合格

if user_info.get('score',none) >= 60:

r = f(*args, **kwargs)

return r

else:

print('你考試不合格,繼續努力......')

return inner

# 2個裝飾器修飾 會先執行判斷年齡的裝飾器,在執行判斷分數的裝飾器

@check_age

@check_score

def swimming():

print('歡迎來游泳'.center(40, '*'))

@check_age

def basketball():

print('歡迎來籃球隊玩耍'.center(40,'*'))

@check_score

def football():

print('歡迎來足球隊飛'.center(40, '*'))

''' 1.籃球不需要分數,但是要年齡滿18歲

2.足球不需要年齡,但要分數滿60

3.游泳急需要年齡滿18 有需要分數滿60

'''def main():

while true:

imp = input('1.籃球,2.足球,3.游泳\n>>>')

age = input('請輸入你的年齡:')

score = input('請輸入你的分數:')

user_info['age'] = int(age)

user_info['score'] = int(score)

if imp == '1':

basketball()

elif imp == '2':

football()

elif imp == '3':

swimming()

if __name__ == '__main__':

main()

Python 中的裝飾器

1.基本概念 問題 裝飾器是什麼?解答 嚴格來說,裝飾器只是語法糖,裝飾器是可呼叫的物件,可以像常規的可呼叫物件那樣呼叫,特殊的地方是裝飾器的引數是乙個函式 問題 裝飾器有什麼特性?解答 裝飾器有 個特性,一是可以把被裝飾的函式替換成其他函式,二是可以在載入模組時候立即執行 def decorate...

python中的 裝飾器

示例 def fun a arg print a arg fun a deffun b print b 輸出 c python34 python.exe c users administrator desktop test.pyab process finished with exit code 0...

python中的裝飾器

什麼是裝飾器 如果有函式a,b,c,已經所有編寫完畢。這時你發現a,b,c都須要同乙個功能,這時該怎麼辦?答 裝飾器 裝飾器事實上就是乙個函式,只是這個函式的返回值是乙個函式 個人理解。裝飾器主要就是為了完畢上邊的這個功能,將a,b,c 函式包裹在還有乙個函式d中。d函式在a函式執行之前或之後,處理...