英文名: 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
類應該完全一樣
假設有兩個裝飾器deco1
和deco2
, 如果這麼用:
@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 函式的...