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

溫馨提示×

溫馨提示×

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

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

python裝飾器三種裝飾模式的簡單分析

發布時間:2020-10-07 05:27:05 來源:腳本之家 閱讀:172 作者:侯賽雷 欄目:開發技術

學設計模式中有個裝飾模式,用java實現起來不是很難,但是遠遠沒有python簡單,難怪越來越火了!

這里就簡單討論下python的幾種裝飾模式:

一 無參裝飾器:

# 裝飾器
import time
 
 
# 裝飾器,記錄函數運行時間
def decorator01(fun):
 def wapper():
  stime = time.time()
  fun()
  etime = time.time()
  print("fun run time is {TIME}".format(TIME=etime - stime))
 return wapper # 必須要返回一個函數的內存地址
 
 
# 使用裝飾器裝飾某個函數,等價于 test01=decorator01(test01),
# 即將test01實際引用變成wapper函數內存地址,所以執行test01實際是執行wapper
@decorator01
def test01():
 time.sleep(2)
 print("test01 is running")
 
 
test01() # 不修改代碼和調用方式,實現添加記錄時間功能

二 函數帶參裝飾器:

# 裝飾器
import time
 
 
# 裝飾器,記錄函數運行時間
def decorator01(fun):
 def wapper(*args, **kwargs): # 使用非固定參數,無論參數是什么,都可以傳遞進來
  stime = time.time()
  fun(*args, **kwargs)
  etime = time.time()
  print("fun run time is {TIME}".format(TIME=etime - stime))
 return wapper # 必須要返回一個函數的內存地址
 
 
# test01() = wapper(), 所以裝飾器加參數是給嵌套函數加參數
@decorator01
def test01(args1):
 time.sleep(2)
 print("參數是 {NAME} ".format(NAME=args1))
 
 
test01("侯征") # 不修改代碼和調用方式,實現添加記錄時間功能

三 裝飾器本身帶參數的裝飾器:

# 裝飾器
import time
 
 
# 如果裝飾器有參數,最外層是裝飾器的參數
def decorator01(*args, **kwargs):
 print("裝飾器參數:", *args, **kwargs)
 def out(fun): #第二層才是接受的函數
  def wapper(*args, **kwargs): # 使用非固定參數,無論參數是什么,都可以傳遞進來
   stime = time.time()
   fun(*args, **kwargs)
   etime = time.time()
   print("fun run time is {TIME}".format(TIME=etime - stime))
 
  return wapper # 必須要返回一個函數的內存地址
 return out # 要返回裝飾函數的內存地址
 
 
# 裝飾器本身帶參數,此時 decorator01(arg)=out,即相當于 @out裝飾test01,所以 test01=out(fun)=wapper
@decorator01(1)
def test01(args1):
 time.sleep(2)
 print("參數是 {NAME} ".format(NAME=args1))
 
 
test01("侯征") # 不修改代碼和調用方式,實現添加記錄時間功能

  這種一開始挺難理解的,但是只要記住一點,@語法糖裝飾器的作用就是 給被裝飾的函數重新賦一個函數的內存地址,即裝飾器內部定義的那個

和你直接fun01=decorator(fun),然后 fun01()是一樣的,只是這樣寫不用改變原來調用方式

@decorator

def fun():

即就是 fun=decorator(fun) 所以,當裝飾器有參數時,還需要返回一個函數,這個函數才是用來裝飾作用的, decorator(1)=out, 即 fun=out(fun) !!

所以外面再包一層就行了,其實就相當于@decorator(1)=@out,即 decorator(1)=out ,實際裝飾器時out,只不過decorator(1)返回了一個out 這樣理解就簡單多了 ,無參的@就是起賦值作用

以上就是python裝飾器三種裝飾模式的簡單分析的詳細內容,更多關于python 裝飾模式的資料請關注億速云其它相關文章!

向AI問一下細節

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

AI

十堰市| 固安县| 利津县| 通化县| 米泉市| 玉环县| 深圳市| 潜江市| 麦盖提县| 聂拉木县| 武邑县| 湘阴县| 西峡县| 栖霞市| 堆龙德庆县| 罗定市| 文登市| 会宁县| 娄底市| 会理县| 基隆市| 济南市| 商城县| 大名县| 南郑县| 新宾| 连山| 甘泉县| 永寿县| 浪卡子县| 合江县| 彭阳县| 饶河县| 大田县| 安阳市| 布拖县| 京山县| 浦东新区| 盖州市| 辉县市| 昌黎县|