欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python裝飾器知識點補充

 更新時間:2018年05月28日 08:45:56   作者:mugbya  
本篇文章給大家補充了關于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) 

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

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

而上篇說到的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]執(zhí)行程序所用時間: %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

調用并執(zhí)行輸出結果:

print(polynomial_1(1, 5))

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

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

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

相關文章

  • 詳解Python中的測試工具

    詳解Python中的測試工具

    本文介紹了兩個Python中的測試工具: doctest和unittest,并配以簡單的例子來說明這兩個測試模塊的使用方法,需要的朋友可以參考下
    2019-06-06
  • Python進度條的制作代碼實例

    Python進度條的制作代碼實例

    這篇文章主要介紹了Python進度條的制作代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • python讀取mysql數據繪制條形圖

    python讀取mysql數據繪制條形圖

    這篇文章主要為大家詳細介紹了python讀取mysql數據繪制條形圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Django中常遇到的錯誤問題

    Django中常遇到的錯誤問題

    在Django開發(fā)中,設置DEBUG=False時需要配置ALLOWED_HOSTS以防止報錯,此外,如果django-admin.py命令找不到,需添加Django的安裝路徑到系統(tǒng)環(huán)境變量,此文還提供了一些常見Django錯誤的解決方法,如數據庫添加中文報錯、信號無法觸發(fā)等問題
    2024-09-09
  • Python制作進度條的幾種方法

    Python制作進度條的幾種方法

    如果你之前沒用過進度條,八成是覺得它會增加不必要的復雜性或者很難維護,其實不然。要加一個進度條其實只需要幾行代碼,快跟隨小編一起學習學習吧
    2022-12-12
  • python中單下劃線與雙下劃線的區(qū)別及說明

    python中單下劃線與雙下劃線的區(qū)別及說明

    這篇文章主要介紹了python中單下劃線與雙下劃線的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python中常見的導入方式總結

    Python中常見的導入方式總結

    這篇文章主要介紹了Python中常見的導入方式總結,文中有非常詳細的代碼示例,對正在學習python的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • 使用celery和Django處理異步任務的流程分析

    使用celery和Django處理異步任務的流程分析

    Celery是 一個專注于實時處理的任務隊列,它還支持任務調度。 Celery快速,簡單,高度可用且靈活。這篇文章主要介紹了使用celery和Django處理異步任務的流程分析,需要的朋友可以參考下
    2020-02-02
  • pycharm中使用anaconda部署python環(huán)境的方法步驟

    pycharm中使用anaconda部署python環(huán)境的方法步驟

    這篇文章主要介紹了pycharm中使用anaconda部署python環(huán)境的方法步驟,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • matplotlib圖形整合之多個子圖繪制的實例代碼

    matplotlib圖形整合之多個子圖繪制的實例代碼

    matplotlib繪制多個子圖的時候,我們可以根據自己的想法去排列子圖的順序,也可以生成不同的子圖數量,本文就詳細的介紹了matplotlib 多子圖繪制,具有一定的參考價值,感興趣的可以了解一下
    2022-04-04

最新評論