部落格361 Python裝飾器

2021-10-08 23:41:23 字數 2780 閱讀 8139

內容:記錄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 要理解上述 的含義,我們從自定義函式裝...