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

溫馨提示×

溫馨提示×

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

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

Python裝飾器知識點的示例分析

發布時間:2021-08-20 09:23:23 來源:億速云 閱讀:137 作者:小新 欄目:開發技術

這篇文章主要介紹Python裝飾器知識點的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

首先回顧一下關于Python裝飾器以及裝飾器模式

根據Java實現裝飾器模式的,我們可以寫下面一段代碼:

import logging


def use_logging(func):
 logging.warn("%s is running" % func.__name__)
 return func

def foo():
 print('i am foo')

foo = use_logging(foo)

foo() # 調用

這個實現對于上篇文章中提到的Java使用裝飾器。上面也是一個裝飾器,實現最簡單的一個增加函數日志的功能,但是如果這個額外功能是要去檢測傳入的參數時,這時上面的就不行了。這時12步輕松搞定python裝飾器中的例子還是精妙的。

# 裝飾器
def wrapper(func):
 def checker(a, b): # 1
  if a.x < 0 or a.y < 0:
   a = Coordinate(a.x if a.x > 0 else 0, a.y if a.y > 0 else 0)
  if b.x < 0 or b.y < 0:
   b = Coordinate(b.x if b.x > 0 else 0, b.y if b.y > 0 else 0)
  ret = func(a, b)
  if ret.x < 0 or ret.y < 0:
   ret = Coordinate(ret.x if ret.x > 0 else 0, ret.y if ret.y > 0 else 0)
  return ret
 return checker


# 原函數
def add(a, b):
 return Coordinate(a.x + b.x, a.y + b.y)

# 使用裝飾 
add = wrapper(add)

細心你會發現,裝飾器函數的參數就是傳入的原函數,而內部函數的參數跟原函數一模一樣,最外層返回的是內部函數的引用,內部函數返回的是傳入參數的引用調用的結果

這里用到了函數作為參數特性,當然還有些閉包的知識,具體請看 上面提到的博客鏈接,真的講的不錯。

而上篇說到的Python裝飾 特性就是這個神奇的語法糖了,可以這樣使用

# 原函數
@wrapper
def add(a, b):
 return Coordinate(a.x + b.x, a.y + b.y)

帶參數的裝飾器

如果要實現一個帶參數的裝飾器,那要怎么寫呢

def time_diff(s):
 def decorator(func):
  def wrapper(*args, **kwargs):
   start_time = time.time()
   res = func(*args, **kwargs)
   end_time = time.time()
   print("[%s]執行程序所用時間: %s" % (s, end_time - start_time))
   return res
  return wrapper
 return decorator
 
@time_diff("polynomial_1")
def polynomial_1(n, x):
 res = 0
 for i in range(n):
  res += i*pow(x, i)
 return res

調用并執行輸出結果:

print(polynomial_1(1, 5))

[duoxiangshi_1]執行程序所用時間: 4.76837158203125e-06
0

帶參數的裝飾器需要在不帶參數裝飾器外再定義一層函數,最外層函數的返回值是第二層函數的引用。

以上是“Python裝飾器知識點的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

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

AI

承德县| 从江县| 赞皇县| 福建省| 观塘区| 宁晋县| 乌拉特中旗| 安塞县| 荔波县| 平安县| 渝中区| 平昌县| 文水县| 长沙县| 唐山市| 宜丰县| 冕宁县| 高平市| 华安县| 资源县| 开远市| 葫芦岛市| 崇义县| 鹤峰县| 皋兰县| 嘉峪关市| 贵德县| 贵州省| 宜州市| 老河口市| 西峡县| 汤阴县| 灌云县| 乌鲁木齐市| 南昌县| 平定县| 萨迦县| 清新县| 乾安县| 益阳市| 乌鲁木齐县|