Ich habe den folgenden Dekorator, der eine Konfigurationsdatei speichert, nachdem eine mit @saveconfig
dekorierte Methode aufgerufen wurde:
Ich verwende diesen Dekorator in der folgenden Klasse. Nachdem die Methode createkvm
aufgerufen wurde, sollte das Konfigurationsobjekt self.cfg
im Decorator gespeichert werden:
Mein Problem ist, dass ich auf die Objektvariable self.cfg
im Dekorator saveconfig
zugreifen muss. Ein erster naive Ansatz bestand darin, dem Decorator einen Parameter hinzuzufügen, der das Objekt enthält, wie @saveconfig(self)
, aber das funktioniert nicht.
Wie kann ich auf Objektvariablen des Methodenhosts im Decorator zugreifen? Muss ich den Decorator innerhalb derselben Klasse definieren, um Zugang zu bekommen?
Sie müssen Ihre Decorator-Klasse wie einen Deskriptor verhalten, um auf die Beispiel:
%Vor% Ihr Code übergibt object
als ersten Parameter an self.f()
, wobei die pbtools
Instanz übergeben soll.
Sie übergeben object
als self
an die dekorierte Methode. Die Sache ist, Sie können nicht leicht self
erhalten, weil Python die Decorated-Methode sieht, die jetzt ein Objekt ist, und es nicht als eine Methode betrachtet (die beim Aufruf als self
übergeben werden sollte - oder allgemeiner gesagt, das sollte als eine Eigenschaft funktionieren, die eine gebundene Methode zurückbringt). Du kannst das umgehen, wie @Sven Marnach es hervorhebt.
Sie könnten diesen Dekorator jedoch ohne eine Klasse, die einen Verschluss verwendet, leicht umschreiben (ist etwas kürzer und löst auch das obige Problem):
%Vor%Weitere Hinweise:
x = ...
eingerückt so weit wie die Methodendefinitionen und würde zwischen allen Instanzen geteilt werden (speziell wäre es ein Attribut des Objekts, das pbtools
ist) - alles auf self
ist ein Instanzattribut. self
! Sie können auch eine einfache Funktion für das verwenden, was Sie wollen:
%Vor% Wenn saveconfig
eine Klasse sein muss, brauchst du Svens Lösung.