python中的裝飾器(Decorators)

2021-10-01 20:59:39 字數 2455 閱讀 4385

四、裝飾器的執行順序:

定義:python的裝飾器:裝飾原有的函式,用於拓展原來函式功能的一種函式,在不更改原來函式**的基礎上,增加函式的功能。

格式:@ 符號就是裝飾器的語法糖,它放在函式開始定義的地方,這樣就可以省略最後一步再次賦值的操作。

裝飾器的返回值也是乙個函式/類物件。它經常用於有切面需求的場景,比如:插入日誌、效能測試、事務處理、快取、許可權校驗等場景,裝飾器是解決這類問題的絕佳設計。

裝飾器的具體詳解可學習此鏈結

1、函式裝飾器

用@函式名,裝飾器可以巢狀函式,分為裝飾器帶引數和不帶引數的。用法可參照以下**使用。

**引用自:

def

demo1

(demo_name)

:def

(fun)

:print

(demo_name,

) fun(

)# end def

deftest()

:print

(demo_name,

"test"

)# end def

test # 呼叫test方法,此處不能加()。

# end def(demo)

defdemo2

(demo_name)

:#可以建立巢狀的函式,函式也能返回函式

def(func)

:def

callback

(*args,

**kwargs)

:print

(demo_name,

"callback"

)return func(

*args,

**kwargs)

return callback

# end def

deftest

(item)

:print

(demo_name,

"test"

, item)

# end def

test(

"hello"

)# 呼叫test方法

# end def(demo)

defdemo3

(demo_name)

:def

decorate

(tip)

:def

(func)

:def

callback

(*args,

**kwargs)

:print

(demo_name, tip)

return func(

*args,

**kwargs)

return callback

# end def(decorate)

@decorate(

"something"

)# 帶引數的裝飾器

deftest

(item)

:print

(demo_name,

"test"

, item)

# end def

test(

"hello"

)# 呼叫test方法

# end def(demo)

if __name__ ==

'__main__'

: demo1(

"demo1"

)print()

# 被裝飾函式傳參

demo2(

"demo2"

)print()

# 裝飾器傳參

demo3(

"demo3"

)print

()

2、類裝飾器:
class

foo(

object):

def__init__

(self, func)

: self._func = func

def__call__

(self)

:print

('class decorator runing'

) self._func(

)print

('class decorator ending'

)@foo

defbar()

:print

('bar'

)bar(

)functools.wraps

**引用自:

乙個函式還可以同時定義多個裝飾器,從內向外的呼叫,執行順序是從裡到外,最先呼叫最裡層的裝飾器,最後呼叫最外層的裝飾器

@a

@b@c

deff()

:pass

等價於:

f = a(b(c(f)

))

python中的裝飾器

其實去年就開始學python了,零零散散,陸陸續續學了點,期間學習了python web開發,爬蟲系統 但是一些基礎性的知識點長時間不看了就會忘,所以寫個部落格記錄下來,忘了可以隨時檢視,不用回去看 了,希望也能幫助大家學習哈。python中的裝飾器decorator其實是乙個高階函式,它接受乙個函...

Python 中的裝飾器

1.基本概念 問題 裝飾器是什麼?解答 嚴格來說,裝飾器只是語法糖,裝飾器是可呼叫的物件,可以像常規的可呼叫物件那樣呼叫,特殊的地方是裝飾器的引數是乙個函式 問題 裝飾器有什麼特性?解答 裝飾器有 個特性,一是可以把被裝飾的函式替換成其他函式,二是可以在載入模組時候立即執行 def decorate...

python中的 裝飾器

示例 def fun a arg print a arg fun a deffun b print b 輸出 c python34 python.exe c users administrator desktop test.pyab process finished with exit code 0...