Python中函數裝飾器及練習

1)裝飾器的理解:

 

   一、做用:在不改變原函數的基礎上,給函數增長功能app

    二、返回值:把一個函數看成參數,返回一個替代版的函數dom

   三、本質:返回函數的函數函數

   四、應用場景:計時器、記錄日誌、用戶登錄認證、函數參數認證
ui

2)無參函數裝飾器spa

    實例: 被裝飾的函數沒有參數
rest

   

   執行結果爲:日誌

   

3)有參函數裝飾器code

    實例:當年齡小於0時,均輸出0ci

   

4)裝飾器練習
文檔

  一、定時器(獲取每一個函數的執行時間)  

 import time
 import string
 import random
 import functools
 # 隨機生成24個大小寫英文字母
 li = [random.choice(string.ascii_letters) for i in range(24)]
 def getTime(fun):
@functools.wraps(fun)
def wrapper(*args, **kwargs):
start_time = time.time()
rest = fun(*args,**kwargs)
end_time = time.time()
print "函數運行時間爲:%.6f" %(end_time-start_time)
return rest
return wrapper 

 @getTime
 def
con_add():      # 使用+來鏈接
    sum = " "
    for
i in li:
        sum += (i+',')
    print
sum
    return
0
 @getTime
 def join_add():    # 使用內置函數join來鏈接
print ','.join(li)
return 1

 
print con_add()    # 進行調用
 print
join_add()
 
顯示結果以下:因而可知,使用內置函數運行時間小於普通函數。
 

 
注意:1、當被裝飾函數有返回值的時候:咱們須要在裝飾函數裏面,對被裝飾函數調用進行接收;而後返回接收值就能夠顯示被裝飾函數的返回值了!
       2、如何保留被裝飾函數的函數名和幫助文檔信息:導入functools包,並進行調用便可
 二、記錄日誌:打印的日誌格式爲:【字符串時間】 函數名: xx 運行時間:xx 運行返回值:xx
 import time
 import functools
 def add_log(fun):
  @functools.wraps(fun)
  def wrapper(*args,**kwargs):
  start_time = time.time()
  ret = fun(*args,**kwargs)
  end_time = time.time()
  print '[%s] 函數名:%s 運行時間:%.6s 運行的返回值的結果:%d' \
  %(time.ctime(),fun.__name__,end_time-start_time,ret)
 return wrapper
 @add_log
 def Log(x,y):
  time.sleep(1)
  return x+y
 Log(1,2.2)
 
顯示運行結果:

 
 
三、驗證用戶的登錄認證(登錄成功執行被裝飾函數;失敗繼續執行登錄)
 
import functools
 login_user = ['admin', 'root']
 def
is_login(fun):
    @functools.wraps(fun)
    def wrapper(*args, **kwargs): # 能夠使用第一個元組值來判斷
       if kwargs.get('name') in login_user:
          res = fun(*args, **kwargs)
          return res
       else:
          res = login()
          return res
    return
wrapper
 @is_login
 def writeBlog(name):
    return "寫博客..."
 def login():
return "登錄..."
print writeBlog(name = 'admin')      # 此用戶能夠登錄;執行結果爲'寫博客...'
 
註釋:一個函數,能夠有多個裝飾器來修飾
 
四、函數參數認證:
 
1)、當裝飾器爲@required_typeint,float):確保函數接受到的每個參數爲intfloat
  2)、當裝飾器參數爲list,確保每個參數類型均爲list
  3)、當參數爲(str,int):確保函數接受到的每個參數爲str
int
 
4)、類型
若以上參數均不知足,打印TypeError:參數必須是xxx
 import functools
  def required_type(*type):
 def required_all(fun):
  @functools.wraps(fun)
  def wrapper(*args, **kwargs):
  for i in args:
  if isinstance(i, type):
  pass
  else:
  print 'typeError:函數全部的參數並不是', type
  break
 else:
  res = fun(*args, **kwargs)
  return res
  return wrapper
 return required_all
  @required_type(list)
  def add(a, b):
  return a + b
  print add([1,2],2)
 
相關文章
相關標籤/搜索