python中的decorator的作用

來源:互聯網
上載者:User

標籤:一個   原理   div   factor   功能   import   pre   __name__   拓展   

1、概念

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

列出幾個裝飾器函數:

列印日誌:@log

檢測效能:@performance

資料庫事務:@transaction

URL路由:@post(‘/register‘)

2、使用方法

(1)無參數decorator

編寫一個@performance,它可以列印出函數調用的時間。

 1 import time 2  3 def performance(f): 4     def log_time(x): 5         t1 = time.time() 6         res = f(x) 7         t2 = time.time() 8         print ‘call %s() in %fs‘ %(f.__name__,(t2 - t1)) 9         return res10     return log_time11 12 @performance13 def factorial(n):14     return reduce(lambda x,y : x*y,range(1,n+1))15 16 print factorial(10)

運行結果:

 1 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‘。

 1 import time 2  3 def performance(unit): 4     def perf_decorator(f): 5         def wrapper(*args, **kw): 6             t1 = time.time() 7             r = f(*args, **kw) 8             t2 = time.time() 9             t = (t2 - t1)*1000 if unit ==‘ms‘ else (t2 - t1)10             print ‘call %s() in %f %s‘%(f.__name__, t, unit)11             return r12         return wrapper13     return perf_decorator14 15 @performance(‘ms‘)  16 def factorial(n):17     return reduce(lambda x,y: x*y, range(1, n+1))18 19 print factorial(10)

運行結果:

 1 call factorial() in 9.381056 ms 2 3628800 

運行原理:

它的內部邏輯為factorial=performance(‘ms‘)(factorial);

這裡面performance(‘ms‘)返回是perf_decorator函數對象,performance(‘ms‘)(factorial)其實就是perf_decorator(factorial),然後其餘的就和上面是一樣的道理了。

 

python中的decorator的作用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.