91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中的decorator的作用詳解

發布時間:2020-10-12 04:09:33 來源:腳本之家 閱讀:200 作者:丹華抱一鷇音子 欄目:開發技術

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 = time.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, **kw)
   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):
 return reduce(lambda x,y: x*y, range(1, n+1))

print factorial(10)

運行結果:

call factorial() in 9.381056 ms 2 3628800

運行原理:

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

這里面performance('ms')返回是perf_decorator函數對象,performance('ms')(factorial)其實就是perf_decorator(factorial),然后其余的就和上面是一樣的道理了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

桦川县| 三河市| 西平县| 凤翔县| 马尔康县| 双流县| 凤城市| 同德县| 安溪县| 新和县| 新蔡县| 昌都县| 长兴县| 广州市| 鄯善县| 阿勒泰市| 丽水市| 嘉禾县| 新泰市| 邛崃市| 四川省| 安乡县| 肇源县| 明光市| 凤山市| 错那县| 会同县| 偏关县| 壤塘县| 临邑县| 乐都县| 清流县| 久治县| 黎城县| 张家界市| 曲沃县| 金川县| 柯坪县| 金山区| 遵义县| 景洪市|