2010-07-16 13 views
5

Ho una piccola domanda sulla variabile statica e su TypeObjects. Io uso l'API C per avvolgere un oggetto C++ (chiamiamolo Acpp) che ha una variabile statica chiamata x. Chiamiamo mia TypeObject A_Object:API Python C++: "Variabile statica" per un oggetto tipo

typedef struct { 
    PyObject_HEAD 
    Acpp* a; 
} A_Object; 

Il TypeObject è attaccato al mio modulo python "myMod" come "A". Ho definito getter e setter (tp_getset) in modo che io possa accedere e modificare la variabile statica di ACPP in pitone:

>>> 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 ! 

questa soluzione funziona, ma non è davvero "pulito". Vorrei accedere alla variabile statica in Python utilizzando il TypeObject e non le istanze:

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

Qualcuno ha un'idea di aiutarmi?

Grazie in anticipo.

risposta

1

In sostanza, ciò che si sta tentando di fare è definire una "proprietà statica". Cioè, vuoi che una funzione venga chiamata quando ottieni/imposti un attributo della classe.

Con questo in mente, potresti trovare interessante this thread. Parla solo di soluzioni a livello di Python a questo problema, non di tipi di estensione C, ma copre i principi di base.

Per implementare la soluzione proposta in tale thread per un tipo di estensione C, penso che avresti dovuto inizializzare tp_dict e aggiungere ad esso una voce per "x" il cui valore è un oggetto che implementa __get__ in modo appropriato.

+0

Grazie per la risposta. Penso di poter effettivamente risolvere il mio problema aggiungendo un campo a tp_dict dopo la chiamata a PyType_Ready. – ThR37

0

È possibile aggiungere un campo fittizio "x" in A_Object e creare una coppia di metodi set/get. Quando si accede al campo fittizio 'x', il metodo reindirizza la chiamata al campo 'x' statico.

+0

Grazie per la tua risposta ma, in realtà, il problema deriva dal fatto che non vedo alcun modo per definire una coppia di metodi set/get per TypeObject stesso: tutto ciò che possiamo definire è per le istanze del tipo . Così, quando provo a invoque myMod.A.x, ottengo la versione corrente: Non vedo il punto di aggiungere un campo in A_Object. Posso facilmente accedere a "x" da Acpp :: x (è ciò che faccio nella coppia di getter/setter che sono definiti per le istanze dell'oggetto type). – ThR37

Problemi correlati