Python 裝飾器解讀

2021-10-01 07:41:14 字數 2392 閱讀 6573

英文名: decorator

def

decorator

(obj)

:print

("you used a decorator."

)return obj

@decorator

deffunc()

:pass

@decorator

class

clazz

:pass

可以看到, 裝飾器可以應用到函式和類上.

在定義時, 裝飾器表現為乙個可以接受1個引數的callable, 因此, 也可以用有__call__方法, 且該方法接受至少1個的引數的class實現.這個callable返回時, 裝飾器將返回乙個obj, 作為新的類/函式的值.

比如, 這兩種裝飾器是等價的:

def

function_decorator

(msg)

:def

(clazz)

:print

('decorator'

)print

('message:'

, msg)

return clazz

class

class_decorator

:def

__init__

(self, msg)

: self.msg = msg

def__call__

(self, clazz)

:print

('decorator'

)print

('message:'

, self.msg)

return clazz

>>

>

defa

(*args,

**kwargs)

:print

(*args)

defdec

(clazz)

:class

_a(clazz)

:defmm(

):pass

print

('hook a'

)return _a

return dec

>>

> @a(1,

2)classa:

pass

hook a12

>>

>

hasattr

(a,'mm'

)true

>>

>

以上是我在 idle 中的執行結果, 說明在修飾器中, 如果修飾器"含引數", 那麼, 這個裝飾器首先會被當做乙個函式處理. 在這個例子裡, 相當於先執行a(1,2), 將返回結果作為乙個裝飾器應用於class a上.

假設我們已經有了乙個如下的修飾器:

def

decorator

(*args,

**kwargs)

:print

(*args)

defdec

(clazz)

:class

_a(clazz)

:defmm(

):pass

print

('hook a'

)return _a

return dec

那麼, 以下**應該是等效的:

@decorator(1,

2)class

foo:

pass

等效於

dec = decorator(1,

2)@dec

class

foo:

pass

等效於

class

foo:

pass

dec = decorator(1,

2)foo = dec(foo)

這三段**得到的foo類應該完全一樣

假設有兩個裝飾器deco1deco2, 如果這麼用:

@deco1

@deco2

deffunc()

:pass

那麼等價於

func = deco1(deco2(func)

)

鏈結為 github 鏈結或 python 官方文件

漸進式解讀python裝飾器 精

a.python裝飾器解釋 python裝飾器就是用於拓展原來函式功能的一種函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。可能 原函式已經上線了,不好修改 b.定義乙個新函式 引數是 函式名 在新函式中呼叫老函式並加新功能。此新函式就是裝飾器。如下 老函式有 看...

python裝飾器 Python 裝飾器

簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...

python裝飾器 裝飾器

由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...