Python Decorators - __call__ in der Klasse

8

Ich habe versucht, Python-Dekoratoren zu verstehen, und ich habe versucht, ein äquivalentes Programm zu diesem zu schreiben:

%Vor%

Das Problem ist, dass ich nicht verstehe, wie die Methode __call__ der Klasse aufgerufen wird, indem Sie am Ende aFunction() aufrufen.

Wird aFunction() durch myDecorator.__call__(aFunction) ersetzt? Kannst du mir bitte helfen? Wie wäre ein gleichwertiges Programm ohne Dekorateure?

Danke!

    
pinker 21.10.2013, 14:51
quelle

4 Antworten

8

Die Ausgabe Ihres Codes ist

%Vor%

Wissen Sie zuerst, was diese @ Decorator-Syntax bedeutet?

%Vor%

ist nur eine andere Art zu sagen:

%Vor%

Also, in Ihrem Fall

%Vor%

bedeutet nur

%Vor%

Zuerst erstellen Sie im Grunde eine neue Instanz der myDecorator-Klasse, rufen ihren Konstruktor auf (__init__) und übergeben ihr ein aFunction-Funktionsobjekt. Dann führt es Druck und gegebene Funktion aus. Beachten Sie auch, dass dies geschieht, während die Funktion von einem Interpreter geladen wird und nicht, wenn sie ausgeführt wird. Wenn Sie also etwas aus dieser Datei importieren, wird dies geschehen dann ausführen, nicht auf verwenden oder anrufen.

Wenn% ce_de% ausgeführt wird, wenn aFunction immer noch auf die myDecorator-Instanz verweist, ruft es dann die Methode aFunction() von myDecorator auf, die ausgeführt wird. Beachten Sie, dass __call__ in diesem Fall dasselbe ist wie f() , da die Methode f.__call__(f) verwendet wird, um das Aufrufverhalten des Standardobjekts zu aktivieren und zu überschreiben (jedes Objekt kann vereinfacht aufgerufen werden, wenn __call__ method definiert ist).

Wenn Sie eine Funktion ausführen möchten, wenn sie aufgerufen wird, sollten Sie sie der Instanzvariablen in __call__ zuweisen und sie in __init__ von myDecorator aufrufen.

    
Wikiii122 21.10.2013, 18:17
quelle
1

Das ist der ganze Zweck eines Dekorators: eine Funktion durch die vom Dekorator zurückgegebene Funktion zu ersetzen (oder, noch üblicher, zu umbrechen). In Ihrem Fall wird aFunction durch eine Instanz von myDecorator ersetzt. Wenn Sie also aFunction() aufrufen, rufen Sie diese Instanz wirklich auf: In Python ruft der Aufruf einer Klasseninstanz die Methode __call__ auf.

Das Definieren einer dekorierten Funktion entspricht genau diesem:

%Vor%

Normalerweise würde die Umbruchfunktion natürlich die ursprüngliche Funktion aufrufen, nachdem sie alles gemacht hat.

    
Daniel Roseman 21.10.2013 14:55
quelle
1

afunction wird durch eine Instanz der Klasse myDecorator ersetzt. Die Klasse hat eine __call__ -Methode, so dass die Instanz wie eine Funktion aufgerufen werden kann. Unter der Annahme, dass seine Signatur kompatibel ist (normalerweise gibt ein Dekorator etwas zurück, das *args und **kwargs verwendet), kann die Instanz als Ersatz für die ursprüngliche Funktion verwendet werden.

Normalerweise würde die Methode __call__ die umbrochene Funktion aufrufen. Doing in __init__ ist generell falsch; __init__ sollte einen Verweis auf die umbrochene Funktion als Instanzattribut speichern, damit __call__ es aufrufen kann.

    
kindall 21.10.2013 14:54
quelle
1

Hier ist eine Lösung:

%Vor%     
MangoHands 21.10.2013 17:24
quelle

Tags und Links