python函式裝飾符 總結

2021-10-12 18:25:11 字數 2791 閱讀 4210

1 函式修飾符@的作用

例如:有乙個函式func(a, b),它的功能是求a,b的差值,我現在有乙個需求,就是想對函式功能再裝飾下,求完差值後再取絕對值,但是不能在func函式內部實現,這時候就需要裝飾器函式了,比如func = decorate(func)函式,將func函式作為引數傳遞給decorate函式,由decorate來豐富func函式,豐富完成後再返回給func,此時func的功能就豐富

2 函式修飾符@的工作原理

假設用 funa() 函式裝飾器去裝飾 funb() 函式,如下所示:

#funa 作為裝飾器函式

deffuna

(fn)

:#...

fn()# 執行傳入的fn引數

#...

return

'...'

@funa

deffunb()

:#...

其等價於:

def

funa

(fn)

:#...

fn()# 執行傳入的fn引數

#...

return

'...'

deffunb()

:#...

funb = funa(funb)

通過比對以上 2 段程式不難發現,使用函式裝飾器 a() 去裝飾另乙個函式 b(),其底層執行了如下 2 步操作:

被「@函式」修飾的函式不再是原來的函式,而是被替換成乙個新的東西(取決於裝飾器的返回值),即如果裝飾器函式的返回值為普通變數,那麼被修飾的函式名就變成了變數名;同樣,如果裝飾器返回的是乙個函式的名稱,那麼被修飾的函式名依然表示乙個函式。

3 函式修飾符@的使用

例1:被修飾函式帶引數

def

funa

(fn)

:# 最外層的裝飾器函式的引數為被裝飾函式的名字

defaaa

(n):

# 裝飾器內層的函式的引數為被裝飾函式的引數

n = n +

3# 被裝飾函式的引數進行運算(可以認為是擴充套件了功能)

print

("a:"

,n) fn(n)

# 呼叫被裝飾函式

return aaa # 注意:返回時只需返回函式名,不要把變數也帶上

@funa

deffunb

(a):

b = a +

100print

("funb():"

, b)

funb(1)

輸出:a:

4funb():

104

例2:修飾符帶引數,需要比上面例子多一層包裝,把引數也傳進去就好

def

funa

(c):

# 多一層包裝

defbbb

(fn)

:def

aaa(n)

: n = n +

3+ c

print

("a:"

,n) fn(n)

# print("python教程:",n)

return aaa

return bbb

@funa(2)

deffunb

(a):

b = a +

100print

("funb():"

, b)

funb(1)

輸出:a:

6funb():

106

參考自python函式修飾符@的使用

4 python 內建的 3 種函式裝飾器:@staticmethod、@classmethod 和 @property

其中 staticmethod()、classmethod() 和 property() 都是 python 的內建函式。

使用場景:當某個方法不需要用到物件中的任何資源時,將這個方法改為乙個靜態方法

使用方法: 在方法定義的前面加乙個@staticmethod,加上之後, 這個方法就和普通的函式沒有什麼區別了, 只不過寫在了乙個類中, 可以使用這個類的物件呼叫,

(參考自@staticmethod怎麼用?)

使用場景:修飾符對應的函式不需要例項化,不需要 self 引數,但第乙個引數需要是表示自身類的 cls 引數,可以來呼叫類的屬性,類的方法,例項化物件等。

(參考自python classmethod 修飾符)

使用場景:廣泛應用在類的定義中。在繫結屬性時,如果我們直接把屬性暴露出去,雖然寫起來很簡單,但是,沒辦法檢查引數,導致可以把成績隨便改;可以讓呼叫者寫出簡短的**,同時保證對引數進行必要的檢查,這樣,程式執行時就減少了出錯的可能性。

原理:在定義類時,把方法變成屬性,在例項化類後賦值時就可以把方法當做屬性一樣進行賦值在方法中可以定義對引數的檢查操作

使用方法:詳見使用@property

python 函式裝飾 Python 函式裝飾器

無引數的 函式裝飾器 funa 作為裝飾器函式 def funa fn print sakura func a fn 執行傳入的fn引數 print sakura second return sakura return funa def funb print sakurab 返回結果為 sakura...

python 函式裝飾 Python 函式裝飾器

首次接觸到裝飾器的概念,太菜啦!python 裝飾器可以大大節省 的編寫量,提公升 的重複使用率。函式裝飾器其本質也是乙個函式,我們可以把它理解為函式中定義了乙個子函式。例如我們有這麼乙個需求,每次執行乙個函式後,需要知道這個函式執行了多長時間。一般情況下,我會這樣寫 defaccumulate n...

python 裝飾函式

此文的最後乙個蛋疼的例子可以幫助理解這個概念,錯誤寫法 def warp fun print fun print warp def myprint print lalala myprint 這句並沒有卵用,刪掉這句也會有輸出,輸出是由 warp這句列印的 print myprint none 正確的...