Es ersetzt die große Mehrheit der klassischen Anwendungen für benutzerdefinierte Metaklassen auf einfachere Weise.
Denken Sie so darüber nach: Nichts, was direkt im Klassenkörper ist, kann auf das Klassenobjekt verweisen, weil das Klassenobjekt erst lange nach der Ausführung des Körpers existiert (es ist der Auftrag der Metaklasse, das Klassenobjekt zu erstellen). normalerweise type
, für alle Klassen ohne benutzerdefinierte Metaklasse).
Aber der Code im Klassendekorator führt aus, nachdem das Klassenobjekt erzeugt wurde (tatsächlich mit dem Klassenobjekt als Argument!) und kann daher perfekt auf dieses Klassenobjekt verweisen (und normalerweise muss dies tun).
Betrachten Sie zum Beispiel:
%Vor% und jetzt können Sie sich auf Color.red
, Color.green
und & amp; c beziehen, anstatt auf 0
, 1
usw. (Natürlich würden Sie normalerweise noch mehr Funktionalität hinzufügen, um "an% co_de" zu machen % ", aber hier zeige ich nur die einfache Möglichkeit, diese Funktionalität in einen Klassen-Dekorator einzufügen, anstatt eine benutzerdefinierte Metaklasse zu benötigen! -)
Ein Anwendungsfall, den ich mir vorstellen kann, ist, wenn Sie alle Methoden einer Klasse mit einem Funktionsdekorator umhüllen wollen. Angenommen, Sie haben den folgenden Dekorateur:
%Vor%Und die folgende Klasse:
%Vor%Sie können alle Methoden dekorieren:
%Vor%Aber das ist LAME! Stattdessen können Sie dies tun:
%Vor% UPDATE: Eine allgemeinere Version von logall
:
Volle Enthüllung: Ich musste das nie tun und ich habe dieses Beispiel gerade gemacht.