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!
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.
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.
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.
Tags und Links python python-decorators