So finden Sie die umschließende Klasse einer dekorierten Methode in Python

9

Ich versuche eine Decorator-Klasse zu implementieren, die Methoden in anderen Klassen schmücken würde. Ich brauche jedoch die Klasse, die die dekorierte Methode im Decorator bereithält. Ich kann es nirgendwo anders finden.

Hier ist ein Beispiel:

%Vor%

Das wird dies ausdrucken:

%Vor%

In der Decorator-Klasse hat das Callable den Typ function, während es in der Klasse selbst vom Typ instancemethod ist. Ich kann die im_class von instancemethod, aber es gibt keine solche Funktion.

Wie kann ich die Klasse mit der dekorierten Methode aus dem Decorator holen?

Ich könnte das tun:

%Vor%

Aber ich möchte das nicht tun, weil es überflüssig und nicht nett ist.

Oder sollte ich das anders umsetzen? Ich brauche im Grunde ein paar Argumente für den Dekorateur, und ich brauche die Klasse der dekorierten Methode im Decorator.

    
kortsi 15.11.2012, 08:53
quelle

3 Antworten

3

Sie könnten die Klasse dekorieren:

%Vor%

und verwenden Sie den äußeren Dekorator, um das Klassenargument an das innere zu senden.

Keiner Ihrer Vorschläge kann funktionieren, da er Zugriff auf die Klasse erfordert, bevor sie existiert . Wenn Sie eine Klasse definieren, führen Sie den Code zuerst innerhalb seines Körpers aus (Funktionen definieren usw.) und weisen dann den resultierenden Bereich der Klasse als __dict__ zu. Zu dem Zeitpunkt, als decorated_method definiert wurde, ist MyClass noch nicht vorhanden.

    
katrielalex 15.11.2012, 08:57
quelle
1

Hier ist eine überarbeitete Version, die funktioniert.

%Vor%

Die Ausgabe sieht so aus:

%Vor%

Der Unterschied besteht darin, dass es jetzt einen separaten Dekorator für die Klasse gibt. Der Aufruf () des Klassen-Dekorators ruft jeden der method decorators "second_init ()" -Methode auf und übergibt die Klasse dort.

Es ist interessant zu bemerken, dass der Aufruf () des Methoden-Dekoders vor dem des Klassen-Dekoders aufgerufen wird.

    
kortsi 15.11.2012 10:35
quelle
0

Wenn Sie das Objekt, das von Ihrem Decorator zurückgegeben wird, als Deskriptor verwenden, können Sie die Attributsuche haken um ein anderes Objekt zurückzugeben, das die Methode und die Klasse (oder die Instanz) verbindet.

Für einen Methodenstildeskriptor müssen Sie nur die Methode __get__ implementieren. Beim Nachschlagen der Methode für die Klasse sind die folgenden zwei äquivalent:

%Vor%

Und für die folgenden Fälle sind die folgenden gleichwertig:

%Vor%

Also ruft der Ausdruck instance.decorated_method(...) tatsächlich das Objekt auf, das von Ihrer Methode __get__ zurückgegeben wurde. Dies ist derselbe Prozess, bei dem einfache Funktionsobjekte in gebundene Methodenobjekte umgewandelt werden, die das implizite self -Argument hinzufügen.

Wenn Sie dieses Callable erstellen, sollten Sie alle benötigten Informationen haben.

    
James Henstridge 15.11.2012 09:22
quelle

Tags und Links