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...