1. 程式人生 > 程式設計 >Python裝飾器如何實現修復過程解析

Python裝飾器如何實現修復過程解析

Python裝飾器(decorator)在實現的時候,被裝飾後的函式其實已經是另外一個函數了(函式名等函式屬性會發生改變),

為了不影響,Python的functools包中提供了一個叫wraps的decorator來消除這樣的副作用。寫一個decorator的時候,最好在實現之前加上functools的wrap,

它能保留原有函式的名稱和docstring。

未加@wraps的時候:

from functools import wraps


def wrapper(func):
  # @wraps(func)
  def inner(*args,**kwargs):
    print("裝飾器工作中...")
    func(*args,**kwargs)
  return inner
@wrapper
def f1(arg):
  """
  這是一個測試裝飾器修復技術的函式
  :param arg: 隨便傳
  :return: 沒有
  """
  print(arg)

f1('呵呵')
print(f1.__name__,f1.__doc__)

列印結果是:

Python裝飾器如何實現修復過程解析

但是加上@wraps以後:

from functools import wraps


def wrapper(func):
  @wraps(func)
  def inner(*args,f1.__doc__)

列印結果是:

Python裝飾器如何實現修復過程解析

其中主要的就是兩個變數:

1、顯示 正在執行的函式的名稱 f.name

2、顯示 正在執行的函式的註釋 f.doc

簡單來說就是:

如果沒使用@wraps,當A呼叫了裝飾器B的話,即使A.name,返回的會是裝飾器B的函式名稱,而不是A的函式名稱

如果使用了@wraps,當A呼叫了裝飾器B的話,A.__ name__返回的會是A函式的名稱,而不是飾器B的名稱,

這也即使常說的@wraps是裝飾器的修復技術,

實際就是修復還原了A的__ name__變數,同理__ doc__變數也是一樣。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。