1. 程式人生 > >[python] 修飾器

[python] 修飾器

  • 修飾器本質上是一種python函式的代稱,它可以讓其他函式在不需要做任何程式碼變動的情況下增加額外的功能。
  • 既然修飾器的本質是一種python函式,那麼它就有對應的輸入和輸出,他的輸入有兩種可能,一種是引數,一種是function。他的返回值也是一個函式物件。
  • 概括的講,裝飾器的作用就是為已經存在的物件新增額外的功能。
  • 先看一個簡單的例子:下面的函式,我們實現了兩個數字的加法操作。但是現在我們現在需要一個新的功能來實現對add方法輸出一個日誌。

    def add(a, b):
        return a+b
  • 所以,我們又寫了下面的log函式。且先不說引數的多變性,我們還改變的呼叫的方式,原來呼叫過是add函式,現在要呼叫log函數了,就完全打亂了程式碼的結構。

    def log(func, a, b):
        print 'Log: ', func.__name__
        func(a, b)
  • 為了解決上述問題,下面還有一種解決方式(注意,log是修飾器,add是被修飾器),該解決方法還存在一個問題便是,我們都需要寫 被修飾器 = 修飾器(被修飾器);被修飾器();這樣格式的程式碼,那麼我們怎麼簡化程式碼呢?

    def log(func):
        def wrapper(*args, **kwargs):
            print 'Log: ', func.__name__
            func(*args, **kw)
        return
wrapper def add(a, b): return a+b add = log(add) add(4, 5)
  • @運算子因此而來,可以看到,通過執行add方法,我們其實是執行了log(add,4,5)方法,注意,add方法的執行是在wapper內部執行的,如果wapper內沒有func執行的這行程式碼的話,那麼add方法就從沒有被執行過。
def log(func):
    def wrapper(*args, **kwargs):
        print 'Log: ', func.__name__
        func(*args, **kw)
    return
wrapper @wrapper def add(a, b): return a+b add(4, 5)