In einer Decorator-Klasse Zugriff auf die Instanz der Klasse, die die Decorated-Methode enthält

8

Ich habe den folgenden Dekorator, der eine Konfigurationsdatei speichert, nachdem eine mit @saveconfig dekorierte Methode aufgerufen wurde:

%Vor%

Ich verwende diesen Dekorator in der folgenden Klasse. Nachdem die Methode createkvm aufgerufen wurde, sollte das Konfigurationsobjekt self.cfg im Decorator gespeichert werden:

%Vor%

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?

    
ifischer 13.02.2011, 22:50
quelle

3 Antworten

11

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.

    
Sven Marnach 13.02.2011, 22:56
quelle
4

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:

  • Verwechslung der Terminologie: In diesem Beispiel gibt es keine Klassenvariable. Eine Klassenvariable wäre 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.
  • Zur Definitionszeit der Klasse (wenn Sie Methoden definieren, Dekoratoren anwenden usw.) gibt es keine self !
delnan 13.02.2011 22:59
quelle
0

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.

    
Jochen Ritzel 13.02.2011 23:24
quelle

Tags und Links