Unterschied zwischen Dekorationsklassen und Dekorationsfunktionen

Ich denke, das ist, wie sie genannt werden, aber ich werde nur Beispiele geben.

Dekorateur Klasse:

class decorator(object): def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): print 'something' self.func(*args, **kwargs) 

Dekorator-Funktion:

 def decorator(func): def wrapper(*args, **kwargs): print 'something' return func(*args, **kwargs) return wrapper 

Ist das eine oder andere nur eine Frage des Geschmacks? Gibt es einen praktischen Unterschied?

2 Solutions collect form web for “Unterschied zwischen Dekorationsklassen und Dekorationsfunktionen”

Wenn Sie eine Funktion schreiben können, um Ihren Dekorateur zu implementieren, sollten Sie es bevorzugen. Aber nicht alle Dekorateure können einfach als Funktion geschrieben werden – zum Beispiel wenn man einen internen Zustand speichern möchte.

 class counted(object): """ counts how often a function is called """ def __init__(self, func): self.func = func self.counter = 0 def __call__(self, *args, **kwargs): self.counter += 1 return self.func(*args, **kwargs) @counted def something(): pass something() print something.counter 

Ich habe Leute gesehen (einschließlich mich) durch lächerliche Bemühungen, Dekorateure nur mit Funktionen zu schreiben. Ich habe noch keine Ahnung warum, der Overhead einer Klasse ist in der Regel völlig vernachlässigbar.

Es ist in der Regel nur eine Frage des Geschmacks. Die meisten Python-Programme verwenden Enten-Typisierung und egal, ob die Sache, die sie anrufen, eine Funktion oder eine Instanz eines anderen Typs ist, solange es kündbar ist. Und irgendetwas mit einer __call__() Methode ist abrufbar.

Es gibt ein paar Vorteile bei der Verwendung von Design-Stil Dekorateure:

  • Viel sauberer, wenn Ihr Dekorateur keine Wrapper-Funktion zurückgibt (dh es gibt die ursprüngliche Funktion zurück, nachdem Sie etwas dazu gemacht haben, z. B. das Setzen eines Attributs).

  • Keine Notwendigkeit, den Verweis auf die ursprüngliche Funktion explizit zu speichern, da dies durch die Schließung erfolgt ist.

  • Die meisten Werkzeuge, die Ihnen helfen, Dekorateure, wie functools.wraps() oder Michele Simionato's Signatur-erhaltende decorator Modul, arbeiten mit funktionalen Dekorateure.

  • Es kann einige Programme da draußen irgendwo, die nicht verwenden Ente Typisierung, sondern tatsächlich erwarten, einen Funktionstyp, so dass eine Funktion, um eine Funktion zu ersetzen ist theoretisch "sicherer".

Aus diesen Gründen benutze ich meistens funktionstüchtige Dekorateure. Als Gegenbeispiel ist hier jedoch eine neuere Instanz, in der der Klassenstil-Dekorator für mich natürlicher war.

  • Python function call syntax ... result = foo () ['abc']
  • Python If Statement mit mehreren Bedingungen
  • Was ist der Zweck des Dickdarms vor einem Block in Python?
  • Was ist der Unterschied zwischen "2 * 2" und "2 ** 2" in Python?
  • "TypeError: Unicode-Objekte müssen vor dem Hashcodieren codiert werden"
  • Wie kann ich das erreichen?: Von C ++ / C # in Python?
  • Python kehrt aus der funktion
  • Eingebaute magische Variablennamen / Attribute
  • Was ist der Unterschied zwischen Semikolons in JavaScript und Python?
  • Wie man Variable Zuweisung innerhalb einer Weile (Ausdruck) Schleife in Python?
  • Was ist :: (Doppelkolon) in Python bei der Abrechnung von Sequenzen?
  • Python ist die beste Programmiersprache der Welt.