2017-09-28 4 views
0

In PythonBenötigen Decorators in Python das Decorator Pattern?

  1. es richtig ist, dass in Python Dekorateure die Schnittstelle von die dekorierte Funktion/Klasse ändern kann, zum Beispiel Ändern Sie die Signatur der eingerichteten Funktionen und Methoden der dekorierten Klasse? Zum Beispiel:

    >>> def MyDecorator(func): 
    ...  def NewFunc(): 
    ...   pass 
    ...  return NewFunc 
    ... 
    >>> @MyDecorator 
    ... def MyFunc(a, b, c): 
    ...  print(a,b,c) 
    ... 
    
  2. So Dekorateure in Python sind nicht notwendigerweise für die Umsetzung der Dekorateur-Entwurfsmuster verwendet, wie in dem Buch „Design Muster“ von GoF beschrieben?

  3. Ist es eine schlechte Übung, einen Decorator zu schreiben, der die Schnittstelle der dekorierten Funktion/Klasse ändert?

Danke.

+0

Ich denke, die Frage ist gut - aber zu weit gefasst. Ich meine, du hast 3 Fragen (auch wenn sie lose miteinander verbunden sind) statt nur einer. Könnten Sie versuchen, den Umfang der Frage einzuschränken? – MSeifert

+0

@MSeifert Danke. Die Fragen, die mir gestellt werden, sind eng miteinander verwandt und sie sind tatsächlich die gleiche Frage, die in verschiedenen Formen ausgedrückt wird. Wenn ich sie in drei Posts teile, werden sie, glaube ich, Duplikate sein. – Tim

Antwort

1

Von python.org (Hervorhebung von mir):

Die DecoratorPattern ist ein Muster, in dem DesignPatternsBook beschrieben. Es ist eine Möglichkeit, das Verhalten eines Objekts scheinbar zu ändern, indem es in ein Dekorationsobjekt mit einer ähnlichen Schnittstelle einfügt.

Dies ist nicht zu verwechseln mit PythonDecorators, die eine Sprache Feature zum dynamischen Ändern einer Funktion oder einer Klasse ist.

Also ich denke, die Antworten auf Ihre Fragen sind:

  1. Ja
  2. Das ist richtig
  3. No
+0

Danke. Was sind gute Verwendungen von Dekoratoren in Python, die die Oberfläche der dekorierten Funktion/Klasse verändern? – Tim

+0

Ein Beispiel aus der Spitze meines Kopfes: Angenommen, Sie haben eine Funktion, die ein Objekt vom Typ A zurückgibt. Wenn Sie unter Linux arbeiten, ist das Objekt A für Windows ungeeignet, und es wäre besser, das Objekt zu verwenden Geben Sie stattdessen B ein, wenn Sie unter Windows arbeiten. Sie schreiben also einen Decorator, der das aktuelle Betriebssystem überprüft. Wenn es sich um Windows handelt, ändert es den zurückgegebenen Wert von Typ B anstelle von A. – asherbar

1

Sie auch ein paar Antworten in der bekannten Python finden decorator Bibliotheksdokumentation.

Zitiert die Introduction:

Technisch gesehen jede Python Objekt, das mit einem Argument aufgerufen werden kann, kann als Dekorateur verwendet werden. Diese Definition ist jedoch etwas zu groß, um wirklich nützlich zu sein. Es ist bequemer, die generische Klasse von Dekorateure in zwei Unterklassen aufgeteilt:

Signatur erhalt Dekorateure:

aufrufbare Objekte, die eine Funktion als Eingabe und Rückkehr in eine Funktion als Ausgang, mit der gleichen Signatur akzeptieren.

signatur ändernden Dekoratore:

Zierer, der die Unterschrift ihrer Eingangsfunktion ändern, oder Dekoratore die nicht aufrufbaren Objekte zurück.

Signaturändernde Dekoratoren haben ihre Verwendung: zum Beispiel sind die eingebauten Klassen staticmethod und classmethod in dieser Gruppe. Sie nehmen Funktionen und geben Deskriptorobjekte zurück, die weder Funktionen noch Callables sind.

Noch, Signatur-konservierende Dekoratoren sind häufiger und einfacher zu begründen. Insbesondere können sie zusammen zusammengesetzt sein, während andere Dekoratoren im Allgemeinen nicht zusammengefügt werden können.

gleiche Antworten:

  1. Ja
  2. Das ist richtig
  3. No