Python中的 函式裝飾器到底是什麼?

2021-10-18 03:24:48 字數 1671 閱讀 5611

在解釋@函式裝飾器之前,先說一下,類中的類方法和靜態方法。

在python中完全支援定義類方法、靜態方法。這兩種方法很相似,python它們都使用類來呼叫(ps:用物件呼叫也可以)。

區別在於:python會自動繫結類方法的第乙個引數,類方法的第乙個引數會自動繫結到類本身;但對於靜態方法則不會自動繫結。

類方法用@classmethod修飾,靜態方法用@staticmethod修飾,如下:

#coding=utf-8

class

person

: @classmethod

defeat

(cls)

:print

("類方法eat:"

,cls)

@staticmethod

defsleep

(p):

print

("靜態方法sleep:"

,p)person.eat(

)person.sleep(

"info"

)p = person(

)p.eat(

)p.sleep(

'info'

)

控制台列印如下:

解釋:eat方法因為是@classmethod修飾所以它是類方法,所以第12行呼叫時,不用傳入任何引數,即可以呼叫,因為它會自動繫結類本身到第乙個引數。

sleep方法因為是@staticmethod修飾所以它是靜態方法,所以在第13行呼叫時,需要傳入引數。再看17、18行,可以得出結論:不管是用類或者物件呼叫靜態方法,python都不會對靜態方法的第乙個引數進行自動繫結。

上面的@classmethod 和 @staticmethod 其實就是函式裝飾器,其中classmethod和staticmethod為python中內建的函式。

使用@符號引用已有函式後,可用於修飾其他函式。

例如@函式a 裝飾 函式b ,實際完成的步驟為:

1.將被裝飾的函式b作為引數傳給函式a

2.將函式b替換為第1步的返回值。

舉個例子:

'''

'''def

funa

(fn)

:"""引數為乙個函式物件"""

print

('a'

) fn(

)#執行傳入的fn函式

return

'tizer'

'''下面的**相當於funa(funb)

funb將會被替換為該語句的返回值

由於funa返回tizer,因此funb就是tizer

'''@funa

deffunb()

:print

('b'

)print

(funb)

解釋:既然funb作為引數傳給了funa,那就是得先執行funa中的**,所以執行了print(『a』),列印了a,然後執行第4行fn(),因為傳入的funb,funb中的**為print(『b』),所以列印了b,然後funa 返回了乙個字串tizer,所以funb 等同於 tizer,第15行print(funb) 等同於 print(『tizer』),所以列印了tizer。

python中的if while 函式 裝飾器

python程式語言指定任何非0和非空 null 值為true,0 或者 null為false。python 程式設計中 if 語句用於控制程式的執行,基本形式為 if 判斷條件 執行語句 else 執行語句 由於 python 並不支援 switch 語句,所以多個條件判斷,只能用 elif 來實...

python裝飾器 函式裝飾器,類裝飾器

只要實現此 模式,這個obj就叫乙個裝飾器 參考 函式裝飾器 例子 def decorator func def inner args,kwargs print before.res func args,kwargs print after.return res return inner decor...

python 裝飾器 函式裝飾器 類裝飾器

python函式裝飾器和類裝飾器筆記.usr bin env python coding utf 8 author ivan file decorators.py version from functools import wraps 裝飾器 目的是為了給函式新增附加功能 1.不帶引數裝飾器 此方式...