天天看點

Python實踐11-裝飾器本質

裝飾器的本質

Python裡的裝飾器是一個不太容易了解的東西,下面是一些關于Python裝飾器的概念:

  • 從形式上來說是在函數調用上的裝飾
  • 以@開頭,接着是裝飾器的名字和可選的參數
  • 裝飾器實質上是函數
  • 裝飾器的傳回值是一個包裝了的函數

裝飾器的作用

裝飾器用來裝飾函數,可以在被裝飾的函數調用前做些準備工作,在被裝飾的函數調用後做些清理工作,這樣的特征使它在AOP(Aspect Oriented Programming面向切面程式設計)方面被廣泛利用。 一般裝飾器可以用在下類場景中:

  • 引入日志
  • 計時,用于性能分析
  • 給函數增加事務能力

舉例

def delay(func):
    def wrapper(*args, **kwargs):
        time.sleep(1)
        ret = func(*args, **kwargs)
        print("delay 1 second to call %s" % func.__name__)
        return ret
    return wrapper


@delay
def add(a, b):
    return a + b


if __name__ == "__main__":
    add(1, 2)
           

其中:

  • add是被裝飾的函數
  • delay是裝飾器
  • wrapper調用被裝飾的函數,并作為包裝了的函數被傳回,注意,Python裡面函數就是對象,是以可以被直接傳回。

凡是被delay裝飾過的函數,都會自動被延遲一秒執行

代碼下載下傳

本系列文章和代碼已經作為項目歸檔到github,大家覺得有幫助就請在github上star一下,你的支援是我更新的動力。github倉庫位址:jumper2014/PyCodeComplete