tengo 2 clases, A y B. B hereda deCython y C++ herencia
//C++
class A
{
public:
int getA() {return this->a;};
A() {this->a = 42;}
private:
int a;
};
class B: public A
{
public:
B() {this->b = 111;};
int getB() {return this->b;};
private:
int b;
};
Ahora me gustaría para interconectar estas dos clases usando Cython y tener la posibilidad de llamar a la Geta() método A. desde una instancia de B:
a = PyA()
b = PyB()
assert a.getA() == b.getA()
Actualmente mi archivo pyx se parece a esto:
cdef extern from "Inherit.h" :
cdef cppclass A:
int getA()
cdef cppclass B(A):
int getB()
cdef class PyA:
cdef A* thisptr
def __cinit__(self):
print "in A: allocating thisptr"
self.thisptr = new A()
def __dealloc__(self):
if self.thisptr:
print "in A: deallocating thisptr"
del self.thisptr
def getA(self):
return self.thisptr.getA()
cdef class PyB(PyA):
def __cinit__(self):
if self.thisptr:
print "in B: deallocating old A"
del self.thisptr
print "in B: creating new b"
self.thisptr = new B()
def __dealloc__(self):
if self.thisptr:
print "in B: deallocating thisptr"
del self.thisptr
self.thisptr = <A*>0
def getB(self):
return (<B*>self.thisptr).getB()
Mientras espero que este código es n Al hacer algo demasiado peligroso, también espero que haya una mejor manera de manejarlo.
También usando el módulo genera el siguiente resultado:
>>> from inherit import *
>>> b = PyB()
in A: allocating thisptr
in B: deallocating old A
in B: creating new b
>>> b.getA()
42
>>> b.getB()
111
>>> del b
in B: deallocating thisptr
y no me gusta mucho la asignación de un Un ejemplo sólo para liberarla inmediatamente después.
¿Algún consejo sobre cómo hacerlo correctamente?
Bueno, abriendo una recompensa, estaba buscando una construcción idiomática para este caso. Usted dice que no conoce Python y Cython. Si bien su respuesta puede adaptarse para ser el código legal de Python (y Cython), esto le daría al usuario de Python el poder de bloquear el intérprete, lo cual es en mi opinión mucho peor que perder asignaciones de memoria – ascobol
Mi respuesta es demasiado larga para un comentario, por favor vea la última mitad de mi publicación –
a) Creo que solo puede haber un constructor en Cython, como en Python. b) luego en cada método deberíamos verificar si la inicialización es correcta ... c) tal vez esto sea posible con un valor arbitrario predefinido en el módulo C. En PyA __ cinit__ verificaríamos un argumento adicional con este valor no trivial que omitiría la asignación. En este caso, un usuario no puede bloquear el intérprete "por accidente". – ascobol