python中的decorator的作用詳解

2022-10-03 12:57:11 字數 1847 閱讀 5020

1、概念

裝飾器(decorator)就是:定義了乙個函式,想在執行時動態增加功能,又不想改動函式本身的**。可以起到復用**的功能,避免每個函式重複性編寫**,簡言之就是拓展原來函式功能的一種函式。在python中,裝飾器(decorator)分為 函式裝飾器 和 類裝飾器 兩種。python中內建的@語言就是為了簡化裝飾器呼叫。

列出幾個裝飾器函式:

列印日誌:@log

檢測效能:@performance

資料庫事務:@transaction

url路由:@post('/register')

2、使用方法

(1)無引數decorator

編寫乙個@performance,它可以列印出函式呼叫的時間。

import time

def performance(f):

def log_time(x):

t1 = timwww.cppcns.come.time()

res = f(x)

t2 = time.time()

print 'call %s() in %fs' %(f.__name__,(t2 - t1))

return res

return log_time

@performance

def factorial(n):

return reduce(lambda x,y : x*y,range(1,n+1))

print factorial(10)

執行結果:

call factorial() in 0.006009s 2 3628800

執行原理:

此時,factorial就作為performance的函式物件,傳遞給f。當呼叫factorial(10)的時候也就是呼叫log_time(10)函式,而在log_time函式內部,又呼叫了f,這就造成了裝飾器的效果。說明f是被裝飾函式,而x是被裝飾函式的引數。

(2)帶引數decorator

請給 @performace 增加乙個引數,允許傳入's'或'ms'。

import time

def performance(unit):

def perf_decorator(f):

def wrapper(*args, **kw):

t1 = time.time()

r = f(*args, **kwww.cppcns.comw)

t2 = time.time()

t = (t2 - t1)*1000 if unit =='ms' else (t2 - t1)

print 'call %s() in %f %s'%(f.__name__, t, unit)

return r

return wrapper

return perf_decorator

@performance('ms')

def factorial(n):

retu reduce(lambda x,y: x*y, range(1, n+1))

print factorial(10)

執行結果:

call factorial() in 9.381056 ms 2 3628800

執行原理:

它的內部邏輯為factorial=perfogjxlzbjgckrmance('ms')(factorial);

這裡面performance('ms')返回是perf_decorator函式物件,performance('ms')(factorial)其實就是perf_decorator(factorial),然後其餘的就和上面是一樣的道理了。

本文標題: python中的decorator的作用詳解

本文位址:

理解python函式裝飾器 decorator

函式裝飾器是python有別於其他語言的主要特徵之一,這也是充分發揮了動態語言的優勢,可以使我們在編寫程式時更加簡潔。但最開始接觸函式裝飾器有點難以理解,本文盡量用簡單的語言來理解函式裝飾器。在理解函式裝飾器之前,最好儲備並理解了以下python的基礎知識 生活中,化妝可能是最容易理解裝飾行為的例子...

python中 python中的 與

這一部分首先要理解python記憶體機制,python中萬物皆物件。對於不可變物件,改變了原來的值,其別名 變數名 繫結到了新值上面,id肯定會改變 對於可變物件,操作改變了值,id肯定會變,而 是本地操作,其值原地修改 對於 號操作,可變物件和不可變物件呼叫的都是 add 操作 對於 號操作,可變...

python中的物件 Python中的變數 物件

由於沒時間系統學習下python 只能見乙個問題 乙個問題了 一 初級 物件 關於python中的資料型別,今天重新認識了下。參考 首先,python中,物件才有型別,變數是沒有型別的,它只是物件的 引用 其次,python中物件被分為兩類 可更改物件和不可更改物件 包括numbers,string...