關於python裝飾器的一些體會總結。

2021-09-02 11:04:56 字數 1510 閱讀 3072

首先說下裝飾器的目的,在不改變原函式的情況下給函式新增功能。

裝飾器的三個要求:

不能修改被裝飾的函式的源**

不能修改被裝飾的函式的呼叫方式

滿足1、2的情況下給程式增添功能

假設給下列函式新增個計算執行時間的功能,原函式

然後

看似實現了功能,可是有個問題,此時只能用time_count(test),無法進行time = time_count(test)呼叫,那就是改變了原函式的呼叫方式。為啥?函式呼叫的型別取決於他的返回值,這裡沒有return。

改進下

說下過程,其實就是,現在記憶體中申請了個time_count方法放那暫時不用,test函式是作為引數傳到裝飾器裡的,然後呼叫deco_timer時候返回的是time_count在記憶體中的位址,原test函式也是個在記憶體中的位址,吧test這個指標指向time_count,這時候test就不是原來的test了,而是現在的time_count,呼叫test()就相當於呼叫time_count(),

上圖

帶引數的裝飾器咋整?

引數放到形參fn裡就好了。

如果原函式有返回值咋整?

例如這樣的test

其實原來的test函式就是現在那個形參fn在的位置,裝飾之後的test指向的是現在的time_count

用res接收一下原test函式的返回值,然後return出去。

順便提一句:裝飾器的要求有兩個,在不能修改原函式**的基礎上增加功能,而且不能修改呼叫方式。

其實功能部分的修改就是time_count,已經完成了。外層函式deco_timer的功能僅僅是把形參fn(原test函式)的指標(記憶體位址)指向內層的time_count。這樣再呼叫test函式的時候,實際上呼叫的是time_count函式,因為記憶體位址已經被修改過了。

最後乙個問題,腫麼用乙個裝飾器對不同的函式進行不同的裝飾?

簡單,給裝飾器乙個引數用來標記就好。外面再套一層= =,上圖

python裝飾器的一些理解

以乙個帶引數的函式的裝飾器為例子 def debug func def something 指定一毛一樣的引數 print debug enter format func.name return func something 這裡寫func something 好像也可以 debug defsay ...

python裝飾器的一些理解

以乙個帶引數的函式的裝飾器為例子 def debug func def something 指定一毛一樣的引數 print debug enter format func.name return func something 這裡寫func something 好像也可以 debug defsay ...

關於 Python 裝飾器的一些個人理解

本質是乙個接受引數為函式的函式。作用 為乙個已經實現的方法新增額外的通用功能,比如日誌記錄 執行計時等。不帶引數的裝飾器,不用 不帶引數的裝飾器 defdeco test func def args,kwargs print before function f func args,kwargs pr...