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

溫馨提示×

溫馨提示×

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

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

Python——裝飾器(無參)

發布時間:2020-07-13 00:47:24 來源:網絡 閱讀:573 作者:AiSmile 欄目:編程語言

裝飾器

裝飾器可以疊加使用,執行是從下到上執行的

無參裝飾器 @logger

1.它是一個語法糖

2.函數作為它 的形參

3.返回值也是一個函數

4.可以使用 @function 方式,簡化調用

注意: 此處的裝飾器的定義并不準確,只是方便理解

裝飾器和高階函數

裝飾器是高階函數,但裝飾器是對傳入函數功能的裝飾

裝飾器函數的演化過程:

"""

裝飾器

一個普通的加法函數,想增強他的功能

"""

def add(x,y):

   return x + y

"""增加信息輸出功能"""

def add(x,y):

   print("call add,x+y")# 日志輸出到控制臺

   return x + y

"""上面的函數是完成了需求,但是有缺點

1.print語句的耦合度太高

2.加法函數屬于業務功能,而輸出信息的功能,屬于非業務功能代碼,不該放在業務函數加法中"""

"""把添加功能移出來"""

def logger(fn):

   print("call add,x+y")

   ret = fn(3,4)

   return ret

print(logger(add))

def logger(fn,x,y):

   print("call add,x+y")

   ret = fn(x,y)

   return ret

print(logger(add,3,4))

def logger(fn,*args,**arges):

   print("call add,x+y")

   ret = fn(*args,**arges)

   return ret

print(logger(add,3,4))

def logger(fn):

   def wrapper(*args,**arges): # 可變位置傳參,可變關鍵字傳參

       print("call add,x+y")

       ret = fn(*args,**arges) # 參數解構

       return ret

   return wrapper

print(logger(add)(4,5))

add = logger(add) # add = wrapper

ret = add(4,5) # wrapper(4,5)

裝飾器 核心思想

import datetime

def logger(fn):

   def wrapper(*args,**arges): # 可變位置傳參,可變關鍵字傳參

       print("前面增強")

       start = datetime.datetime.now()

       ret = fn(*args,**arges) # 參數解構

       delta = (datetime.datetime.now() - start).total_seconds()

       print("so fast") if delta < 5 else print("so slow")

       print("后面增強")

       return ret

   return wrapper

@logger # add = logger(add) => add 就是 wrapper

def add(x,y): # wrapper(4,5)

   return x + y

ret = add(4,5) # wrapper(4,5) => logger(add)(4,5)

print(ret)

理解裝飾器:

1.裝飾器函數

2.前置功能增強

3.被增強函數

4.后置功能增強


def logger(fn):                     # 調用 被裝飾的函數

   def wrapper(*args,**kwargs):    # 傳入被裝飾函數參數

       print("before function")    # 前置功能增強

       ret = fn(*args,**kwargs)    # 使用被裝飾函數的功能

       print("after function")     # 后置功能增強

       return ret                  # 返回被裝飾函數的 計算結果

   return wrapper                  # 返回 被裝飾的函數

@logger                             # 無參裝飾器

# @logger <==> add = logger(add) = wrapper # add(x,y) == wrapper(x,y)

def add(x,y):                       # 被裝飾的函數

   return x + y

add(3,4)

print(add(3,4))

#看似調用add函數,使用了裝飾器@logger之后,實際上 調用的是 wraaper(*args,**kwargs)函數


向AI問一下細節

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

AI

凉山| 琼中| 青田县| 富宁县| 汤原县| 芜湖市| 桃江县| 云梦县| 江陵县| 丽水市| 都安| 南华县| 交口县| 湘西| 兖州市| 普定县| 大连市| 灵山县| 新疆| 湖州市| 祥云县| 大兴区| 定远县| 合阳县| 凤山市| 岱山县| 长兴县| 洪洞县| 浙江省| 永泰县| 永嘉县| 金湖县| 扎鲁特旗| 江源县| 什邡市| 蓬溪县| 建湖县| 镇赉县| 阿坝| 崇州市| 萝北县|