2010-07-16 13 views
5

Tengo una pequeña pregunta sobre la variable estática y TypeObjects. Uso la API C para envolver un objeto C++ (llamémoslo Acpp) que tiene una variable estática llamada x. Vamos a llamar a mi TypeObject A_Object:Python API C++: "Variable estática" para un Objeto Type

typedef struct { 
    PyObject_HEAD 
    Acpp* a; 
} A_Object; 

El TypeObject está conectada a mi módulo de Python "mimodelo" como "A". He definido getter y setters (tp_getset) para que pueda acceder y modificar la variable estática de ACPP de pitón:

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

esta solución funciona, pero no es muy "limpia". Me gustaría tener acceso a la variable estática en Python usando la TypeObject y no los casos:

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

¿Alguien tiene una idea para que me ayude?

Gracias de antemano.

Respuesta

1

Básicamente, lo que intenta hacer es definir una "propiedad estática". Es decir, desea que se llame a una función cuando obtiene/establece un atributo de la clase.

Con eso en mente, puede encontrar this thread interesante. Solo habla de soluciones de nivel Python para este problema, no de tipos de extensiones C, pero cubre los principios básicos.

Para implementar la solución propuesta en ese hilo para un tipo de extensión C, creo que debe inicializar tp_dict y agregarle una entrada para "x" cuyo valor es un objeto que implementa __get__ apropiadamente.

+0

Gracias por su respuesta. Creo que puedo resolver mi problema añadiendo un campo a tp_dict después de la llamada a PyType_Ready. – ThR37

0

Puede agregar un campo "x" ficticio en el A_Object y crear un par de métodos set/get. Cuando acceda al campo ficticio 'x', el método redirigirá la llamada al campo estático 'x'.

+0

Gracias por su respuesta, pero, en realidad, el problema proviene del hecho de que no veo ninguna manera de definir un par de métodos set/get para el TypeObject en sí: todo lo que podemos definir es para las instancias del tipo . Por lo tanto, cuando intento invocar myMod.A.x aparece en mi versión actual: No veo el sentido de agregar un campo en el A_Object. Puedo acceder fácilmente a "x" por Acpp :: x (eso es lo que hago en el par de getter/setter que se definen para las instancias del objeto tipo). – ThR37

Cuestiones relacionadas