裝飾器是學Python的必須路程,是非常重要的一點!那什麼是柯里化裝飾器,什麼又是柯里化呢!
柯里化就是將原來接收兩個參數的函數變成接收一個參數的函數的過程,新的函數返回一個以原來第二個參數爲參數的函數!似乎與返回函數有點類似(⊙o⊙)…
在學裝飾器之前最好先學完返回函數和高階函數!
裝飾器顧名思義就是具有包裝的作用,在Python中裝飾器就是對一個既定的函數功能進行包裝,增添新的功能,但是不能在其內部進行修改,不改動源代碼,只能在其外部進行包裝!好比一幅畫對其進行裝飾,但是我們只能給他裝裱,不能對其修改畫的內容,這就是Python中的裝飾器的作用!
def show():
print('xmc') #定義一個函數,顯示 xmc
def logger(m): #定義一個函數來接收一個參數
def wrapper(): #這個函數是用來包裝我們需要裝飾的函數
#在這裏可以進行裝飾(前)
ret = m() #原有函數的執行,一定不能改動
#在這裏可以裝飾 (後)
return ret
return wrapper #返回一個函數,調用wrapper包裝函數
n = logger(show) #這一部分可見返回函數淺析
print(n()) #xmc
上面的代碼比較少,介紹了裝飾器的基本構成,下面來個大的,詳細的解析!
import time
import datetime
def logger(m):
def wrapper(*args, **kwargs): #當logger接收參數後返回了wrapper函數,此時也就是開始調用wrapper函數,當傳入的數時可變時我們使用以上類型!參數結構知識,可以在上篇博客瞭解!
print("args={},kwargs={}".format(args,kwargs)) #字符串知識,打印參數列表
start = datetime.datetime.now() #計時函數,也是裝飾內容
ret = m(*args, **kwargs) #原函數執行
delay = (datetime.datetime.now()-start).total_seconds() #計時
if delay > 3:
print("{} take {}s.".format(m.__name__,delay)) #判斷,也就是裝飾內容
return ret
return wrapper #返回函數
@logger
#相當於add=logger(add) add被覆蓋了,指向包裝wrapper函數
def add(x,y):
time.sleep(3)
return x + y #實現函數加法功能!
print(add(x=1,y=2))
裝飾器就是拓展原有功能,不改變源代碼的一種方式!