Python的 修飾符和裝飾器

2021-07-06 10:07:31 字數 1684 閱讀 9160

發表於 

由python的修飾器的英文名叫decorator。

『@』修飾符必須出現在函式定義前一行,不允許和函式定義在同一行。也就是說@a def f(): 是非法

的。 只可以在模組或類定義層內對函式進行修飾,不允許修飾乙個類。

所謂裝飾器就是把原函式包裝一下,對原函式進行加工,新增一些附加功能,裝飾器本身就是乙個函

數,就是將被裝飾的函式當作引數傳遞給裝飾器,返回包裝後的函式:你可以試下:

defd(

fp):

def_d

(*arg,**

karg

):print

"do sth before fp.."r=

fp(*

arg,

**karg

)print

"do sth after fp.."

return

r

return_d

@ddef

f():

print

"call f"

#上面使用@d來表示裝飾器和下面是乙個意思

#f = d(f)f()

#呼叫f

裝飾器帶引數:再包裝一層

被裝飾的函式還有其他引數:上面的例子包裝函式就是接收任意形式的引數

其實帶引數的裝飾器是經過呼叫」裝飾器」函式返回的乙個裝飾器, 之所以裝飾器上打引號是說明這個所謂的」裝飾器」只不過是乙個普通的函式, 但這個普通的函式返回乙個裝飾器。

乙個修飾符就是乙個函式,它將被修飾的函式做為引數傳入,並返回修飾後的函式或其它可呼叫的東西。

先看一段**

#!/usr/bin/python

deftest

(func

):func

()@test

deffun

():print

"call fun"

上面的**沒有main()呼叫或者直接的函式呼叫,結果還是會輸出

call fun
@修飾符有點像函式指標,python直譯器發現執行的時候如果碰到@修飾的函式,首先就解析它,找到

它對應的函式進行呼叫,並且會把@修飾下面一行的函式作為乙個函式指標傳入它對應的函式。有點繞

口,這裡說的「它對應的函式」就是名字是一樣的。下面說下之前**的解析流程:

1.python直譯器發現@test,就去呼叫test函式

2.test函式呼叫預先要指定乙個引數,傳入的就是@test下面修飾的函式,也就是fun()

3.test()函式執行,呼叫fun(),fun()列印「call fun」

再看一段**

#!/usr/bin/python

deftest

(func

):func

()print

"call test over"

defmain

():@test

deffun

():print

"call fun"

#main()

這樣呼叫的話就不會呼叫test,只有當main函式呼叫的時候才會進入到main函式,然後呼叫test

其他資料參考

python修飾器的函式式程式設計

python高階

python裝飾器學習(九步入門)

python深入05 裝飾器

修飾符 python中的裝飾器

裝飾器模式可以在不影響其他物件的情況下,以動態 透明的方式給單個物件新增職責,也能夠處理那些可以撤銷的職責。經常用於日誌記錄 效能測試等場合。想象一下這個很常見的場景,你寫了乙個方法只提供給以登陸的使用者訪問 事實上我也是通過django的 login required才了解到 修飾符的 你可以寫以...

python 修飾符 python 修飾符

修飾符基礎 閉包 什麼是閉包呢?標準的概念大家可以看wikipedia上的解釋 舉個例子 def do add base def add increase return base increase return add do add函式裡巢狀了乙個內層函式add,這個內層函式就是乙個閉包,其實可以也...

python 修飾符 python訪問修飾符

許可權訪問 偽許可權,只是壓縮時按規則換了變數名,python 的哲學是假定使用者都會使用 xx 以單下劃線開頭的表示的是protected型別的變數。即保護型別只能允許其本身與子類進行訪問。若內部變數標示,如 當使用 from m import 時,不會將以乙個下劃線開頭的物件引入 成俗約定,不做...