国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python裝飾器知識點補充

2020-02-15 21:32:43
字體:
來源:轉載
供稿:網友

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

補全

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

import loggingdef use_logging(func): logging.warn("%s is running" % func.__name__) return funcdef 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裝飾 特性就是這個神奇的語法糖了,可以這樣使用

# 原函數@wrapperdef 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-060

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

總結:多些多練,用于實際中,才能更加熟練。最近學數據結構與算法,寫些裝飾器用來看程序執行時間,真是再方便不過了!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 洛阳市| 安达市| 莱西市| 武城县| 南雄市| 嫩江县| 航空| 宝兴县| 乐业县| 肇东市| 北票市| 荆门市| 西昌市| 东莞市| 尚义县| 玛沁县| 马公市| 华坪县| 渑池县| 平顺县| 旬阳县| 隆回县| 南宫市| 内乡县| 蕉岭县| 波密县| 同仁县| 蒙城县| 福建省| 集安市| 郯城县| 佛山市| 丰城市| 平陆县| 白银市| 正阳县| 东兴市| 喀什市| 荔浦县| 东山县| 临邑县|