Ich versuche, einen Decorator für eine Instanzmethode einer Klasse zu erstellen, die das Ergebnis protokolliert. (Dies wurde schon millionenmal gemacht.) Allerdings hätte ich gerne die Möglichkeit, den Memo-Cache jederzeit zurückzusetzen (zB wenn sich etwas im Instanz-Zustand ändert, was das Ergebnis der Methode möglicherweise verändern würde) mit seinen Argumenten zu tun). Also habe ich versucht, einen Decorator als eine Klasse anstelle einer Funktion zu erstellen, so dass ich als Klassenmitglied Zugriff auf den Cache haben könnte. Dies führte mich auf den Pfad des Lernens über Deskriptoren, insbesondere die __get__
-Methode, wo ich eigentlich feststecke. Mein Code sieht so aus:
Ist das klar und / oder möglich? Jedes Mal, wenn __get__
aufgerufen wird, erhalte ich eine brandneue Instanz der memoisierten Klasse, die den Cache mit den darin enthaltenen Daten verliert. Ich habe hart mit __get__
gearbeitet, aber mache keine großen Fortschritte.
Gibt es einen völlig separaten Zugang zu diesem Problem, den ich komplett vermisse? Und alle Ratschläge / Vorschläge sind willkommen und geschätzt. Danke.
Anstatt zu versuchen, die Mechanismen Ihrer Implementierung auszuarbeiten, habe ich die Klasse memoized
decorator aus PythonDecoratorLibrary <übernommen / a>, und habe es so modifiziert, dass reset
hinzugefügt wurde. Unten ist das Ergebnis; Der Trick, den ich verwendet habe, besteht darin, der dekorierten Funktion selbst ein aufrufbares reset
-Attribut hinzuzufügen.
Aufbauend auf der Antwort auf die ursprüngliche Frage von @ aix habe ich eine Klasse erstellt, von der ich denke, dass sie sie verbessern könnte. Das Hauptmerkmal ist, dass die zwischengespeicherten Werte als eine Eigenschaft der Instanz gespeichert werden, deren Methode dekoriert wird, daher ist es sehr einfach, sie zurückzusetzen.
%Vor%Als ein Anwendungsbeispiel:
%Vor%wird als Ausgabe ausgegeben:
%Vor% Nun möchte ich auf zwei Leistungsprobleme in Ihrem Code hinweisen. Dies ist keine Antwort auf Ihre Frage, aber ich kann es nicht kommentieren. Danke an @delnan für den Hinweis, dass has_key
veraltet ist. Statt:
Ich würde es so machen:
%Vor% Dies vermeidet: a) try / except KeyError
; b) Aufruf von cache[key]
bei Rückgabe; c) erneutes Aufrufen der Funktion auf nicht ausdehnbaren Tasten.
Tags und Links python decorator descriptor memoization