2017-09-28 222 views
0

在Python,Python中的裝飾器必須實現裝飾器模式嗎?

  1. 它是正確的,在Python裝飾可以改變 的界面處的裝飾功能/類,例如修改 裝飾類的裝飾功能和方法的簽名?例如:

    >>> def MyDecorator(func): 
    ...  def NewFunc(): 
    ...   pass 
    ...  return NewFunc 
    ... 
    >>> @MyDecorator 
    ... def MyFunc(a, b, c): 
    ...  print(a,b,c) 
    ... 
    
  2. 所以在Python裝飾不一定用於由GoF的書中「設計模式」中描述的實施裝飾設計模式?

  3. 編寫修飾裝飾函數/類的接口的裝飾器是不好的做法嗎?

謝謝。

+0

我認爲這個問題是好的 - 但過於寬泛。我的意思是你有3個問題(即使他們是鬆散連接)而不是一個。你能否試圖縮小問題的範圍? – MSeifert

+0

@MSeifert謝謝。對我的問題是密切相關的,而且他們實際上是以不同形式陳述的同一個問題。如果我把它們分成三個帖子,我恐怕會重複。 – Tim

回答

1

python.org(我的強調):

的DecoratorPattern處於DesignPatternsBook描述的圖案。 這是一種明顯修改對象行爲的方式,通過將 包含在具有類似接口的裝飾對象中。

這不要與PythonDecorators混淆,這是一種語言 功能動態修改函數或類。

所以我猜這個問題的答案是:

  1. 這是正確的
  2. 沒有
+0

謝謝。在Python中修飾裝飾函數/類的接口的裝飾器有什麼好用處? – Tim

+0

從我的頭頂開始的一個例子:假設你有一個函數返回一個類型爲A的對象。然後你意識到,雖然這對Linux有效,但對象A不適合Windows,並且最好使用在Windows上運行時鍵入B.所以你寫一個裝飾器來檢查當前的操作系統。如果它是Windows,它會將返回的值修改爲類型B而不是A. – asherbar

1

您還可以找到一些答案在著名的Python decorator庫文檔。

引述Introduction

從技術上講,它可以與一個參數調用任何Python對象可以被用作裝飾。但是,這個定義有點太大而不能真正有用。這是更方便分裂泛型類裝飾的兩個子類:

簽名保留裝飾:它接受一個函數作爲輸入,並返回一個函數作爲輸出,具有相同簽名

調用對象。

簽名變化的裝飾:

裝修改變它們的輸入功能的簽名,或裝飾器返回非可調用的對象。

簽名變化的裝飾器有它們的用途:例如,內置類staticmethod和classmethod在這個組中。它們接受函數並返回既不是函數又不可調用的描述符對象。

仍然,簽名保留裝飾器更常見,並且更容易推理。特別是,它們可以組合在一起,而其他裝飾者通常不能。

相同的答案:

  1. 這是正確的
  2. 沒有