簡單說明Python中的裝飾器的用法

來源:互聯網
上載者:User
裝飾器對與Python新手以至於熟悉Python的人都是一個難理解, 難寫的東西. 那麼今天就分享一下我對Python 裝飾器的理解

所謂裝飾器僅僅是一種文法糖, 可作用的對象可以是函數也可以是類, 裝飾器本身是一個函數, 其主要工作方式就是將被裝飾的類或者函數當作參數傳遞給裝飾器函數, 比如定義如下裝飾器

import timedef run_time(func):  def wrapper(*args, **kwargs):    start = time.time()    r = func(*args, **kwargs)    print time.time() - start    return r  return wrapper

我們用這個裝飾器裝飾一個test函數

@run_timedef test():  print "just a test"

前面說過其實裝飾器就是一個文法糖, 就是將被裝飾的函數作為參數傳遞給裝飾器函數, 所以上面可以展開為

test = run_time(test)

裝飾器將在解譯器運行一開始就被載入, 從而將被裝飾的函數將被展開成如上方式, 因為 run_time裝飾器返回wrapper函數, 所以當調用test函數時其實就是對wrapper的調用

如果你在Python shell下執行以上語句就會發現定義完test函數然後查看test時, shell所展示的是wrapper函數

接下來說說如何編寫帶參數的裝飾器, 大家如果細心的話就可以發現其實帶參數的裝飾器是經過調用"裝飾器"函數返回的一個裝飾器, 之所以裝飾器上打引號是說明其實這個所謂的"裝飾器"只不過是一個普通的函數, 但這個普通的函數返回一個裝飾器, 可以參看下面例子:

import timedef route(url):  def decorator(func):    func.__url__ = url    return func  return decorator@route(r"/")def index():  return "Hi"

大家可以發現在使用route裝飾器時我們其實是調用了route函數, route函數返回一個decorator裝飾器, 因為我們不需要在裝飾器內運行函數, 所以不需要一個wrapper函數來收集參數.

以上就是全部內容, 希望對裝飾器一知半解的人有些許協助

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.