關於Python的修飾器(一)

2021-09-26 07:31:10 字數 1554 閱讀 4613

python對於將函式作為引數傳遞給另乙個函式呼叫是非常方便的,只要你在函式中將呼叫的引數按照函式處理進行呼叫,這種操作就能順利完成。如:

def s(n):

sum=0

for i in range(n): sum+=i

return sum

def p(f):

a=eval(input('輸入乙個數'))

print('數的累加為:'f(a))

執行p(s),即能夠從鍵盤獲得輸入並列印出結果。這裡將函式s作為引數傳遞給p是非常方便的。而在p中,之所以將引數f認為是函式,則是因為對它的使用是按照函式進行的。

在python中,修飾器是c++等其它語言中沒有的新特性,通過修飾器的定義,可以對乙個物件在其外部通過修飾器對其進行修改,而不用修改這個物件本身。如下:

def mydec(f):                      #定義乙個函式,該函式以另乙個函式f作為引數

if(f()>=5): lambda:return f()*2

else: return lambda:f()

@mydec                                   #定義乙個下面的hello物件的mydec修飾器

def hello():

return eval(input('輸入乙個數'))

在上面的例子中首先定義了乙個函式mydec,函式接收乙個函式引數。該函式就可以被修飾器作用用來修飾其它函式物件了。

下面定義了乙個函式hello,該函式將mydec作為修飾器。當修飾器定義完成後,python直譯器會自動呼叫函式hello並將修飾器作用於hello,即相當於進行了如下表示式的函式呼叫:

hello=mydec(hello)

其結果是把函式mydec中的效果施加在了函式hello之上。在本例中,如果使用者輸入的數大於等於5,最後形成的hello函式實際上是對原hello函式乘以2,否則就是原hello函式,從而在沒有修改hello的基礎上完成了對hello的修改或者修飾。

通過這個例子我們可以注意有以下幾個要點:

對被修飾物件的修改和修飾是由修飾器函式完成的(本例中的mydec),該函式由於要對被修飾物件進行修飾,所以應該首先定義,並接收乙個被修飾物件引數,以便完成對該物件的修飾;

如例子中所表達的,修飾器實際完成的是被修飾物件通過修飾函式進行修飾的操作,即如例子的hello=mydec(hello),所以修飾函式的返回值最終將作用於被修飾物件。所以從邏輯上講,修飾器函式應該返回與被修飾物件相同的物件,如例子中通過無名函式返回的依然是相類似的函式。當然,理論上講,修飾器函式完全可以返回其它任何型別的物件,當然這樣的結果實際上就完全修改了被修飾物件,所以一般不要這麼做,以免發生不可預料的結果;

修飾器只在定義完成後立即執行,所以其修飾作用會立刻發生,之後只要沒有重新執行修飾器定義,該作用會保持不變。如例子中函式hello從鍵盤接收並返回乙個輸入。當修飾器定義完成後,python編輯器會立即執行修飾器,並通過修飾函式呼叫被修飾函式hello,要求使用者提供乙個輸入。這時如果使用者輸入大於等於5,這時hello函式會被修飾為返回2*使用者輸入的值,之後如果再次執行函式hello,不管使用者輸入是否大於等於5,都會返回2*使用者輸入值了。

python中 修飾器

參考文章 python中 修飾符 示例如下 def test func func test deffun print call fun 上面的 會輸出 call fun 修飾符有點像函式指標,python直譯器發現執行的時候如果碰到 修飾的函式,首先就解析它,找到它對應的函式進行呼叫,並且會把 修飾...

python 修飾器作用

在python的函式中,函式定義的上一行有 functionname的修飾,當直譯器讀到 這樣的修飾符之後,會先解析 後的內容,把 下一行的函式或者類作為 後邊的函式的引數,然後將返回值賦值給下一行修飾的函式物件。比如 a bdef c deffunca a print in func a deff...

python 詳解 修飾器的用法

python中 的用法 是乙個裝飾器,針對函式,起呼叫傳參的作用。有修飾和被修飾的區別,function 作為乙個裝飾器,用來修飾緊跟著的函式 可以是另乙個裝飾器,也可以是函式定義 1def funa desa print it s funa def funb desb print it s fun...