python裝飾器作用 理解python中的裝飾器

2021-10-10 03:51:44 字數 2043 閱讀 4701

一 什麼是裝飾器?

正如其名,裝飾器的作用是為已經存在的物件增加額外功能(裝飾),由此可使已有函式在無需**改動的情況下增加額外功能;裝飾器的本質是巢狀的函式且返回函式物件,即閉包。有關閉包的概念,可參考《理解python中的閉包》一文。

二 裝飾器應用場景舉例

在介紹裝飾器之前,我們思考下遇到如下場景時的解決思路,然後在此基礎上,描述裝飾器的意義和旨在解決哪些問題。

假如我們的func函式已經在使用,而且工作的挺好,func函式如下:def func():

print("執行func**塊")

然而,某天針對該函式有新需求提出,暫時命名為需求1:為func函式增加效能度量,即測量函式的執行耗時。

針對需求1,一種可以簡單理解的實現形式如下:#實現1 增加執行耗時統計

def func():

start_time = time.time()

print("執行func**塊")

end_time = time.time()

print("執行耗時:%s"%(end_time-start_time))

從實現來看,滿足了需求1,但如果其餘的函式也提出了類似的需求,如func1、func2都需要增加耗時測量,按上面的實現方式,func1、func2也需要在原功能前後增加time.time()**,這樣就造成了**重複和冗餘。

針對**重複的問題,另一種實現方式是,定義乙個專用的耗時測量函式,當需要測量某個函式時,直接將被測函式作為該測量函式的入參,實現形式如下:# 實現2將公共**抽離,定義專用函式

def count_time(func_name):

start_time = time.time()

func_name()

end_time = time.time()

print("執行耗時:%s"%(end_time-start_time))

從上面實現來看,功能耗時統計的**被抽離並定義在共用函式count_time裡,當需要測量某個函式時,直接呼叫該count_time函式即可。

如:count_time(func) #對func函式進行耗時統計

如:count_time(func1) #對func1函式進行耗時統計

但這種實現也是有問題的,需求是希望直接呼叫func()函式即可完成對功能耗時的測量,但目前的實現方式,需要使用另外乙個函式count_time,顯然改變了函式的呼叫方式。

三 裝飾器為原有函式增加額外功能

針對上面場景描述及問題分析,我們使用裝飾器解決該問題,首先定義裝飾器函式如下:#定義裝飾器函式

def timer(func_name):

start_time = time.time()

func_name()

end_time = time.time()

print("執行耗時:%s" % (end_time - start_time))

從裝飾器的定義來看,其實就是乙個閉包實現,滿足了在上篇對閉包三個條件的定義:

3)返回是乙個內部函式的引用;

因此,裝飾器本質是函式,是閉包的應用。

現在,我們用裝飾器timer實現對func函式所提出的需求,即增加函式耗時測量功能。

使用裝飾器的方法如下:

func = timer(func)#1

func() #2

使用上面2步,呼叫func()時,雖然函式名相同,原func()函式也未做改動,但輸出結果已經增加了耗時統計功能。如果不理解,請繼續看上篇《理解python中的閉包》中關於閉包的講解j。

另外,python的裝飾器有個更簡潔的表示方式,即使用「語法糖」@,如下:@timer #@語法糖 相當於 test1 = timer(test1) 只能放在定義函式的上面

def func():

print("執行func**塊")

#使用裝飾器語法糖@的呼叫方式func()#直接呼叫即可

四 裝飾器的作用

從上文分析,可以了解到,裝飾器主要用於為已存在的函式物件附件額外的功能,而原先的函式的內部實現可以不做改動,呼叫方式也保持不變,而這些附加的功能是可以抽離出來作為共用的,避免了相似場景下**的冗餘。

其他資源分享:

python裝飾器作用 python裝飾器有什麼用

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

理解python中裝飾器的作用

裝飾器的作用就是用乙個新函式封裝舊函式 是舊函式 不變的情況程式設計客棧下增加功能 然後會返回乙個新函式,新函式就叫做裝飾器,一般為了簡化裝飾器會用語法糖 新函式來簡化 例子 這是一段 但功能太少,要對這個進行增強,但又不能改變 def hello return hello world 現在我們的需...

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

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