Python裝飾器 給函式或類增加功能

2021-09-23 10:41:42 字數 3938 閱讀 4652

使用裝飾器裝飾類

實現累積裝飾器

在python程式中,可以使用裝飾器給不同的函式或者類插入相同的功能。於其它高階語言相比,python不僅簡化了裝飾器**,而且可以快速的實現所需要的功能。同時,裝飾器在為函式或者類增加功能時變得十分透明。

首先,乙個裝飾器簡單來說就是乙個函式(方法),只不過裝飾器函式的引數必須是乙個函式或者類。然後在裝飾器函式中重新定義乙個新的函式或類,並且在其中執行某些功能前後或中間來使用被裝飾的函式或類,最後返回這個新定義的函式或類。

def

decorate1

(fun)

:def()

:print

("第一層裝飾:原函式執行前的列印語句"

) fun(

)print

("第一層裝飾:原函式執行後的列印語句"

)def

original_fun()

:print

("原函式內容"

)original_fun(

)#列印原來函式內容

original_fun=decorate1(original_fun)

original_fun(

)#再用同樣的原函式名列印顯示的是加強版本的函式

輸出:

原函式內容

第一層裝飾:原函式執行前的列印語句

原函式內容

第一層裝飾:原函式執行後的列印語句

可使用特殊符號"@「來實現,使用」@裝飾器名稱"的形式將符號"@"放在函式或類的定義行之前

def

decorate1

(fun)

:def()

:print

("第一層裝飾:原函式執行前的列印語句"

) fun(

)print

("第一層裝飾:原函式執行後的列印語句"

)@decorate1

deforiginal_fun()

:print

("原函式內容"

)original_fun(

)

輸出:

第一層裝飾:原函式執行前的列印語句

原函式內容

第一層裝飾:原函式執行後的列印語句

與裝飾器裝飾函式類似,唯一區別就是裝飾器內嵌函式改為內嵌類

def

decorate1

(fun)

:class()

:def

__init__

(self):)

#保留乙個original_class類物件

defprintf

(self)

:print

("原類執行前的列印語句"))

#原始類original_class的乙個物件,呼叫original_class類的例項方法printf()

print

("原類執行後的列印語句"

)

class

original_class

:def

__init__

(self)

: self.text=

"i am original_class"

defprintf

(self)

:print

(self.text)

o_class=decorate1(original_class)

o_class(

).printf(

)

輸出:

原類執行前的列印語句

i am original_class

原類執行後的列印語句

def

decorate1

(fun)

:class()

:def

__init__

(self):)

#保留乙個original_class類物件

defprintf

(self)

:print

("原類執行前的列印語句"))

#原始類original_class的乙個物件,呼叫original_class類的例項方法printf()

print

("原類執行後的列印語句"

)@decorate1

class

original_class

:def

__init__

(self)

: self.text=

"i am original_class"

defprintf

(self)

:print

(self.text)

if __name__==

"__main__"

: ori=original_class(

) ori.printf(

)

輸出:

原類執行前的列印語句

i am original_class

原類執行後的列印語句

def

decorate1

(fun)

:def()

:print

("第一層裝飾:原函式執行前的列印語句"

) fun(

)print

("第一層裝飾:原函式執行後的列印語句"

)def

decorate2

(fun)

:def()

:print

("第二層裝飾:原函式執行前的列印語句"

) fun(

)print

("第二層裝飾:原函式執行後的列印語句"

)def

original_fun()

:print

("原函式內容"

)original_fun=decorate2(decorate1(original_fun)

)original_fun(

)

輸出:

第二層裝飾:原函式執行前的列印語句

第一層裝飾:原函式執行前的列印語句

原函式內容

第一層裝飾:原函式執行後的列印語句

第二層裝飾:原函式執行後的列印語句

def

decorate1

(fun)

:def()

:print

("第一層裝飾:原函式執行前的列印語句"

) fun(

)print

("第一層裝飾:原函式執行後的列印語句"

)def

decorate2

(fun)

:def()

:print

("第二層裝飾:原函式執行前的列印語句"

) fun(

)print

("第二層裝飾:原函式執行後的列印語句"

)@decorate2

@decorate1

deforiginal_fun()

:print

("原函式內容"

)original_fun(

)

輸出:

第二層裝飾:原函式執行前的列印語句

第一層裝飾:原函式執行前的列印語句

原函式內容

第一層裝飾:原函式執行後的列印語句

第二層裝飾:原函式執行後的列印語句

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.不帶引數裝飾器 此方式...

函式裝飾器 類裝飾器

一 函式裝飾函式 defwrapfun func definner a,b print function name func.name r func a,b return r return inner wrapfun defmyadd a,b return a b print myadd 2,3 二...