首先,什麼是裝飾器?
比較官方的解釋是:
裝飾器是用來管理和呼叫函數和類別的一個可呼叫對象,也就是說分為函數裝飾器和類別裝飾器
這個定義函數我自己通俗化了一點,不然更加看不懂,其實我還有一句更加概括的話,可以解釋裝飾器:
裝飾器就是對被裝飾的對象(函數、類別)進行重構的,其可以在不改變原來物件的情況下調用物件時執行重構後的行為
這裡你可能就糊塗了,看不懂
沒關係我們慢慢來! ! !
首先,裝飾者的語法你一定知道
def decorator(f): def wrapper(x,y): return x+y return wrapper @decorator def func(x,y): return 1 func(3,4)
那,看這段程式碼,你可能根據上面你有幾個疑問:
一、decorator是什麼意思?
二、這裡重構的行為是什麼?
三、整個裝飾的行為或流程是怎麼樣的?
我們看上面那一段程式碼,很顯然,說過裝飾器就是一個可呼叫對象,這個沒問題吧,在上面的裝飾器它就是一個函數。
重構的行為是什麼?
上面的一段程式碼的重構行為就是講func的執行碼替換成了wrapper的執行碼,也就是說,程式碼的最終輸入是 7 而不是 1。
其實上面的兩個問題是廢話,我們解決了第三個問題,自然而然的就理解了!
好了,在繼續看之前我們記住一句話:
裝飾器本身接受被裝飾的對象,裝飾器返回的可調用對象接受被裝飾對象的所有參數
一定要仔細看這句話,理解加記憶吧!
在上面那一段程式碼中
裝飾器是: decorator
# 傳回的可呼叫物件是: wrapper
被裝飾的物件是:func
好了,你先在套這個你去看看這個這個函數的執行流程
當然,這時候你還會有一個疑問:
當呼叫func (3,4)的時候發生了什麼事?
此時:傳回的可呼叫物件(wrapper)給了func,你也可以理解為現在的func的程式碼是
def func(x,y): return x+y
這時的func就完全不是自己本身定義的func的,它是不是在某種意義上算是被重構了!
到這裡你是不是理解了什麼是裝飾器,應該是理解了吧!
不過我們還沒結束,因為我要讓你徹底的了解什麼是裝飾器!
之前我們說過,不只函數裝飾器,還有類別裝飾器,那接下來我們就看看類別裝飾器是怎麼運作的,我還是要把之前那段話貼在這裡,你別忘了!
裝飾器本身接受被裝飾的對象,裝飾器返回的可調用對象接受被裝飾對象的所有參數
class Decorator: def __init__(self,f): self.func = f def __call__(self,x,y): return self.func(x,y) + 1 @Decorator def func(x,y): return x+y func(3,4) # 你来想想这时候的结果是什么?
我們來一步步的分析一下,
首先,我們說裝飾器只接受被裝飾的物件做參數,也就是說此時有
Decorator(func) # 这段代码对应着第一句话 # 接下来是 func(3,4) # 这句话是不是触动了__call__方法 # 接下来就是第二句话:返回的可调用对象接受被装饰对象的所有参数 # 所以3,4就被传递给了__call__方法 # 此时的func是什么 return self.func(x,y) + 1 # 也就是说结果为8,而不是7
接下來來點難的看看:
def decorator(f): def wrapper(self,x,y): return self.name + x + y return wrapper class C: name = '土' @decorator def method(x,y): return x + y ins = C() myname = ins.method('行','孙')
思考一下這個答案是什麼?
能想出來基本上理解了什麼是裝飾器了!
相關推薦:《Python教學》
以上是Python直裝飾器是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!