內容:記錄python的裝飾器
裝飾器:
python的裝飾器(decorator)可以說是python的乙個神器,它可以在不改變乙個函式**和
呼叫方式的情況下給函式新增新的功能。
裝飾器本質:
python的裝飾器本質上是乙個巢狀函式,它接受被裝飾的函式(func)作為引數,並返回乙個包裝
過的函式。這樣我們可以在不改變被裝飾函式的**的情況下給被裝飾函式或程式新增新的功能。
python的裝飾器廣泛應用於快取、許可權校驗、效能測試和插入日誌等應用場景。
有了裝飾器,我們就可以抽離出大量與函式功能本身無關的**,增加乙個函式的重用性。
裝飾器使用場景:
你的程式一直執行也沒啥問題,有一天突然需要增加臨時新功能,為了過渡使用或者為了某個臨時
活動而增加的功能,比如:618打折活動等。此時如果你去手動修改每個程式的**一定會讓你崩潰,
而且還破壞了那些程式的重用性。此時你可以編寫乙個@temp_function的裝飾器
通用裝飾器:
def set_fun
(func)
: def call_fun
(*args,
**kwargs)
:print
("裝飾器中args引數"
, args)
print
("裝飾器中kwargs引數"
, kwargs)
return
func
(*args,
**kwargs) # 拆包
return call_fun
@set_fun
def test
(*args,
**kwargs)
:print
("被裝飾函式args"
,args)
print
("被裝飾函式kwargs"
,kwargs)
為通用裝飾器傳參:
# 裝飾器傳參:三個函式巢狀,最外層返回乙個閉包的引用,最外層必須有引數
def set_value
(value)
: def set_fun
(func)
: def call_fun
(*args,
**kwargs)
:print
("裝飾器引數:"
,value)
return
func
(*args,
**kwargs)
return call_fun
return set_fun
為了解決這個問題保證裝飾過的函式__name__屬性不變,我們可以使用functools模組裡的wraps方法,先對func變數進行wraps
def set_fun
(func)
: @wraps
(func)
def call_fun
(*args,
**kwargs)
:print
("裝飾器中args引數"
, args)
print
("裝飾器中kwargs引數"
, kwargs)
return
func
(*args,
**kwargs) # 拆包
return call_fun
多個裝飾器裝飾同乙個函式:
def decorator_one
(func):(
*args,
**kwargs)
:print
('decorator one start'
) result =
func
(*args,
**kwargs)
print
('decorator one end'
)return result
def decorator_two
(func):(
*args,
**kwargs)
:print
('decorator two start'
) result =
func
(*args,
**kwargs)
print
('decorator two end'
)return result
@decorator_two
@decorator_one
def hello_python()
:print
('hello python!'
)hello_python
()
結果:
decorator two start
decorator one start
hello python!
decorator one end
decorator two end
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 函式的...
python裝飾器原理 Python裝飾器原理
裝飾器 decorator 是物件導向設計模式的一種,這種模式的核心思想是在不改變原來核心業務邏輯 的情況下,對函式或類物件進行額外的修飾。python中的裝飾器由python直譯器直接支援,其定義形式如下 decorator def core service 要理解上述 的含義,我們從自定義函式裝...