Zugriff auf Funktionsargumente von Decorator

8

Ich habe einen Request-Handler und einen Decorator, ich möchte mit dem Self-Objekt im Decorator arbeiten

%Vor%

Update: Bitte beachten Sie den Unterschied zwischen dem ersten und zweiten Selbst

%Vor%
  1. MyHandler & gt; get (Funktion) & gt; self (Argument)
  2. myDecorator & gt; __call__ (Funktion) & gt; self (Argument)

Die oben genannten Eigenargumente sind unterschiedlich. Meine Absicht ist, auf das erste selbst von __call__ function zuzugreifen, oder einen Weg zu finden, etwas Ähnliches zu tun.

Hallo kann ich auf MyHandlers Selbstargument von erhalten Funktion innerhalb des Dekorators zurückgreifen?

Update2: Ich möchte einen Decorator implementieren, um mit einem benutzerdefinierten Login in der Google App Engine zu arbeiten:

Ich habe eine Klasse (requestHandler):

%Vor%

Und ich möchte die get-Funktion dekorieren, um herauszufinden, ob der Benutzer angemeldet ist oder nicht:

%Vor%

Ich weiß, ob ein Benutzer angemeldet ist, wenn die Eigenschaft 'user_key' in einem Sitzungsobjekt vorhanden ist.

Das ist das Hauptziel, an dem ich mich in diesem speziellen Fall interessiere.

Lassen Sie mich Ihre Vorschläge / Meinungen wissen, wenn ich etwas falsch mache!

Danke!

    
Mc- 24.06.2011, 15:26
quelle

5 Antworten

9

Ich bin nicht ganz klar, was Sie wollen, aber wenn Sie nur die Argumente der verzierten Funktion verwenden wollen, dann ist das genau das, was ein einfacher Dekorateur macht. Um zu sagen, self.request von einem Dekorator, die Sie tun könnten:

%Vor%

Wenn Sie versuchen, auf die Klasse zuzugreifen, an die die dekorierte Funktion angehängt ist, dann ist es ein kleiner Trick und Sie müssen ein bisschen schummeln, indem Sie die inspect Modul.

%Vor%

Im obigen Beispiel holen wir den Namen der Klasse aus dem aktuellen Rahmen (während der Ausführung des Dekorators) und speichern ihn dann in der dekorierten Funktion. Hier stellen wir den Klassennamen auf die Variable msg vor und leiten sie an die ursprüngliche say -Funktion weiter, aber Sie können Ihre Vorstellungskraft nutzen, um zu tun, was immer Sie wollen, sobald Sie den Klassennamen haben.

%Vor%     
Chris Farmiloe 24.06.2011, 15:56
quelle
1

Versuchen Sie diesen Ansatz: Kann ein Python sein Dekorator einer Instanzmethode Zugriff auf die Klasse?

Nicht die exakt gleiche Frage, aber Sie sollten in der Lage sein, den gleichen Ansatz zu verwenden, um einen Verweis auf self oder einen Verweis auf ein Wörterbuch mit Objekten einer bestimmten Klasse darin zu erstellen, die Sie in Ihrem Dekorateur herausholen können.

>     
marr75 24.06.2011 15:40
quelle
1
%Vor%     
warvariuc 27.06.2011 06:10
quelle
1

Quelle

%Vor%     
Massimo Variolo 06.09.2016 07:31
quelle
0

Das Argument self bis __call__ wird mit der Instanz gefüllt, in der die dekorierte Methode aufgerufen wird. Es gibt keine Möglichkeit, von hier aus auf das Decorator-Objekt zuzugreifen - __call__ ist eine gebundene Methode, und nach was du verlangst, würde es erfordern, dass es "doppelt gebunden" ist. Python unterstützt dies nicht, daher wird die Decorator-Instanz durch das erste Argument der dekorierten Funktion ersetzt.

Der einfachste Weg, dies zu umgehen, ist die Verwendung verschachtelter Funktionen, wie es von @Chris empfohlen wird.

    
Nick Johnson 27.06.2011 01:48
quelle