Python 裝飾器

 

裝飾器對與Python新手以致於熟悉Python的人都是一個難理解, 難寫的東西. 那麼今天就分享一下我對Python 裝飾器的理解linux

所謂裝飾器僅僅是一種語法糖, 可做用的對象能夠是函數也能夠是類, 裝飾器自己是一個函數, 其主要工做方式就是將被裝飾的類或者函數看成參數傳遞給裝飾器函數, 好比定義以下裝飾器shell

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函數app

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

前面說過其實裝飾器就是一個語法糖, 就是將被裝飾的函數做爲參數傳遞給裝飾器函數, 因此上面能夠展開爲ide

test = run_time(test)

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

若是你在Python shell下執行以上語句就會發現定義完test函數而後查看test時, shell所展現的是wrapper函數: 說說Python裝飾器url


接下來講說如何編寫帶參數的裝飾器, 你們若是細心的話就能夠發現其實帶參數的裝飾器是通過調用"裝飾器"函數返回的一個裝飾器, 之因此裝飾器上打引號是說明其實這個所謂的"裝飾器"只不過是一個普通的函數, 但這個普通的函數返回一個裝飾器, 能夠參看下面例子:spa

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函數來收集參數.code


以上就是所有內容, 但願對裝飾器只知其一;不知其二的人有些許幫助orm

相關文章
相關標籤/搜索