Eine Methode dynamisch an ein bestehendes Python-Objekt anhängen, das mit swig erzeugt wurde?

8

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.

    
dzhelil 05.09.2009, 09:30
quelle

5 Antworten

20

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:

%Vor%

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%     
PaulMcG 05.09.2009, 15:51
quelle
3
%Vor%

Es wird nicht für Klassen funktionieren, die __slots__ verwenden.

    
Bastien Léonard 05.09.2009 09:36
quelle
3

Erstellen Sie eine Unterklasse. Beispiel:

%Vor%     
Alex 05.09.2009 10:22
quelle
2

Das ist meine Antwort von eine andere Frage :

%Vor%     
gnud 05.09.2009 10:23
quelle
1

Beachten Sie, dass Sie mithilfe von Alex 'Unterklassen-Idee mit " from ... import ... as " ein wenig mehr aushelfen können:

%Vor%

Nun hat die Klasse den Standardnamen, aber ein anderes Verhalten.

%Vor%

Natürlich kann das gefährlich sein ...

    
Andrew Jaffe 05.09.2009 11:13
quelle

Tags und Links