2010-07-16 11 views
5

Ich habe eine kleine Frage über statische Variable und TypeObjects. Ich benutze die API C, um ein C++ - Objekt (nennen wir es Acpp), die eine statische Variable namens x hat. Nennen wir meine Typeobject A_Object:Python API C++: "Statische Variable" für ein Type Object

typedef struct { 
    PyObject_HEAD 
    Acpp* a; 
} A_Object; 

Die Typeobject zu meinem Python-Modul "mymod" als "A" angebracht ist. Ich habe Getter und Setter (tp_getset) definiert, so dass ich zugreifen kann und die statische Variable von ACPP aus Python ändern:

>>> import myMod 
>>> myA1 = myMod.A(some args...) 
>>> myA1.x = 34 # using the setter to set the static variable of Acpp 
>>> myA2 = myMod.A(some other args...) 
>>> print myA2.x 
34 
>>> # Ok it works ! 

Diese Lösung funktioniert, aber es ist nicht wirklich „clean“. Ich mag die statische Variable in Python zugreifen, indem Sie den Typeobject verwenden und nicht die Instanzen:

>>> import myMod 
>>> myMod.A.x = 34 # what I wish... 

Hat jemand eine Idee, mir zu helfen?

Vielen Dank im Voraus.

Antwort

1

Im Wesentlichen versuchen Sie, eine "statische Eigenschaft" zu definieren. Das heißt, Sie möchten, dass eine Funktion aufgerufen wird, wenn Sie ein Attribut der Klasse erhalten/setzen.

, die mit im Auge, könnten Sie this thread interessant finden. Es spricht nur über Python-Level-Lösungen für dieses Problem, nicht C-Erweiterungstypen, aber es behandelt die grundlegenden Prinzipien.

Um die in diesem Thread vorgeschlagene Lösung für einen C-Erweiterungstyp zu implementieren, müssen Sie tp_dict initialisieren und einen Eintrag für "x" hinzufügen, dessen Wert ein Objekt ist, das entsprechend implementiert.

+0

Vielen Dank für Ihre Antwort. Ich denke, dass ich tatsächlich mein Problem lösen kann, indem ich nach dem Aufruf von PyType_Ready ein Feld zu tp_dict hinzufüge. – ThR37

0

Sie könnten einen Dummy ‚x‘ Feld in den A_Object hinzufügen und ein Paar setzen/get-Methoden erstellen. Wenn Sie auf das Dummy-Feld "x" zugreifen, leitet die Methode den Aufruf an das statische Feld "x" weiter.

+0

Vielen Dank für Ihre Antwort, aber eigentlich kommt das Problem aus der Tatsache, dass ich keine Möglichkeit sehen, ein Paar setzen/get-Methoden für die Typeobject selbst zu definieren: alles, was wir für die Instanzen des Typs definieren . So, wenn ich versuche myMod.A.x ich in meiner aktuellen Version erhalten invoque: Ich sehe nicht den Punkt, ein Feld in der A_Object hinzuzufügen. Ich kann einfach auf "x" mit Acpp :: x zugreifen (das ist, was ich in dem Paar von Getter/Setter mache, die für die Instanzen des Typobjekts definiert sind). – ThR37

Verwandte Themen