Ich arbeite mit einer Python-Klasse und habe keinen Schreibzugriff auf seine Deklaration.
Wie kann ich eine benutzerdefinierte Methode (z. B. __str__
) an die aus dieser Klasse erstellten Objekte anhängen, ohne die Klassendeklaration zu ändern?
BEARBEITEN:
Danke für all deine Antworten. Ich habe sie alle ausprobiert, aber sie haben mein Problem nicht gelöst. Hier ist ein minimales Beispiel, von dem ich hoffe, dass es das Problem klären wird. Ich benutze swig, um eine C ++ - Klasse zu umhüllen, und die Funktion __str__
von ein Objekt , das vom swig-Modul zurückgegeben wird, zu überschreiben. Ich benutze cmake, um das Beispiel zu erstellen:
test.py
%Vor%example.hpp
%Vor%Beispiel.cpp
%Vor%Beispiel.i
%Vor%CMakeLists.txt
%Vor%Um test.py zu erstellen und auszuführen, kopieren Sie alle Dateien in ein Verzeichnis, und führen Sie in diesem Verzeichnis
aus %Vor%Dies ergibt die folgende Ausgabe:
%Vor%Wie Sie sehen können, hat das swig-Objekt seine eigene str -Funktion, und das ist es, was ich zu überschreiben versuche.
Wenn Sie eine Wrapper-Klasse erstellen, funktioniert dies mit jeder anderen Klasse, entweder integriert oder nicht. Dies wird "Eindämmung und Delegierung" genannt und ist eine gebräuchliche Alternative zur Vererbung:
%Vor% Die Methode __getattr__
delegiert alle nicht definierten Attributanforderungen für Ihr SuperDuperWrapper-Objekt an das enthaltene myobj-Objekt. Tatsächlich könnte man bei Pythons dynamischer Typisierung diese Klasse verwenden, um SuperDuper fast alles zu umhüllen:
Drucke:
%Vor%In Ihrem Fall würden Sie das zurückgegebene Objekt von der Funktion nehmen, die Sie nicht ändern können, und es in Ihren eigenen SuperDuperWrapper einbinden, aber Sie könnten ansonsten immer noch darauf zugreifen, als wäre es das Basisobjekt.
%Vor% Es wird nicht für Klassen funktionieren, die __slots__
verwenden.
Beachten Sie, dass Sie mithilfe von Alex 'Unterklassen-Idee mit " from
... import
... as
" ein wenig mehr aushelfen können:
Nun hat die Klasse den Standardnamen, aber ein anderes Verhalten.
%Vor%Natürlich kann das gefährlich sein ...