python 裝飾器理解與使用

2021-06-29 12:23:24 字數 3447 閱讀 4500

函式裝飾器在python中屬於比較高階但是卻實用並且常用的技術。常見的使用場景比如 要在類裡面實現乙個靜態方法

則需要使用@staticmethod裝飾器,類方法@classmethod則需要這個裝飾器。

函式裝飾器有兩種使用方式,一種是帶引數的,一種是不帶引數的

先說第一種不帶引數的裝飾器使用方式

#-*- coding:utf-8 -*-

defdec

(fun):

print

u"我是dec裝飾器函式"

return fun

@dec

deffunc

():print

u"我是func函式"

func()

以上**輸出如下

我是dec裝飾器函式

我是func函式

以上是不帶引數的裝飾器使用方式

使用python分為兩步 一是定義乙個裝飾器 二是將裝飾器函式應用到函式上面

先說裝飾器的定義

在python 乙個裝飾器可以使任意乙個能夠返回乙個可呼叫物件的可呼叫物件

並且裝飾器的第乙個引數是當前被裝飾的函式的引用 在此例中dec(fun) 這個引數即是對func函式的引用

learning python 的原話是這樣說

in fact, decorators can be any type

of callable and

return any type

of callable:

也就是說 一:裝飾器本身是乙個可呼叫的物件 二:裝飾器必須返回乙個可以呼叫的物件

先說一:

飾器本身是乙個可呼叫的物件
這句話意思是說裝飾器本身必須是可呼叫的,比如說函式是乙個可以呼叫的物件 所以可以用函式來做裝飾器

但是也不一定必須是乙個函式 比如乙個實現了call方法的類物件也是乙個可呼叫的物件也可以用乙個實現了

call方法的類物件來做裝飾器比如以下形式

#-*- coding:utf-8 -*-

class

dec:

def__call__

(slef,fun):

print

u"我是類物件裝飾器"

return fun

@dec()

deffunc

():print

u"我是func函式"

func()

以上**輸出如下

我是類物件裝飾器

我是func函式

再說二:

意思是說乙個函式裝飾器必須要返回乙個可呼叫物件來替代被裝飾的可函式,和第一條類似 返回的可以是乙個函式也可其他可呼叫物件

#-*- coding:utf-8 -*-

defdec

(fun):

print

u"我是dec裝飾器函式"

defrf

(): print(u"我是裝飾器自定義的函式")

return rf

@dec

deffunc

():print

u"我是func函式"

func()

輸出

我是dec裝飾器函式

我是裝飾器自定義的函式

在之前的例子中我們之間返回的是被裝飾的函式的引用,而在此處返回的是乙個在裝飾器裡面定義的乙個函式,這樣就導致了原始函式被裝飾器定義

的函式所取代

下面討論裝飾器的生效時間 當乙個函式應用了乙個裝飾器的時候,當python執行到函式定義處時 也就是說裝飾器在生成函式物件時就開始執行了

裝飾行為看下面的**

#-*- coding:utf-8 -*-

defdec

(fun):

print

u"我是dec裝飾器函式"

defrf

(): print(u"我是裝飾器自定義的函式")

return rf

@dec

deffunc

():print

u"我是func函式"

輸出

我是dec裝飾器函式
上面的**中並沒有呼叫func函式 但是依然有輸出 說明函式裝飾器是在函式物件生成時就已經開始執行

再說帶引數的函式裝飾器

裝飾器也可以帶引數

#-*- coding:utf-8 -*-

defdec

(arg):

print

u"我是帶引數裝飾器函式 -- 引數為%s" % arg

defrf(fun):

print(u"我是裝飾器自定義的函式")

return fun

return rf

@dec('arg_1')

deffunc

():print

u"我是func函式"

func()

輸出

我是帶引數裝飾器函式--

引數為arg_1

我是裝飾器自定義的函式

我是func函式

注意裝飾器的定義方式與之前定義方式的不同

裝飾器巢狀

#-*- coding:utf-8 -*-

defdec

(fun):

print

"in dec -- %s" % fun

defy():

pass

return y

defdec1

(fun):

print

"in dec1 -- %s" % fun

deff():

print

"i'm in dec1 ***"

pass

return f

@dec1

@dec

deffunc

():print

u"我是func函式"

print func

func()

輸出

in dec -- 

in dec1 --

i'min dec1 ***

有以上輸出順序可知 python首先執行dec裝飾器

並將func引用傳入給dec 而dec返回的是內部定義的函式y

此後執行dec1裝飾器 並經dec返回的函式y最為引數傳給dec1

然後 dec1返回函式f 作為最終裝飾結果

所以 呼叫函式func() 相當於呼叫dec1中的f()函式

Python裝飾器的理解與使用教程

python裝飾器 英文decorator 本質是函式 為其他函式新增附加功能。裝飾器本身也是python的乙個重點,所以無論如何你必須弄懂它。裝飾器的存在其實就是為了在需要新增新功能時不影響之前版本的使用的同時來增加新功能,其實也是一種 偷懶 的辦法。它的使用場景較多,比如 插入日誌 效能測試 事...

python裝飾器理解 python裝飾器理解

裝飾器 在不改變原函式的 和呼叫方法的基礎上,給原函式增加額外的功能 理解宣告 為了方便理解,以下例子採用最簡潔的函式和新增的功能 給原函式新增乙個執行時間 import time def timer func def inner func return inner timer func timer...

python裝飾器 理解Python裝飾器

在python中,對於乙個函式,若想在其執行前後做點什麼,那麼裝飾器是再好不過的選擇,話不多說,上 usr bin env coding utf 8 script 01.py author howie from functools import wraps def decorator func wr...