A と B の 2 つのクラスがあります。B は A から継承します。
//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;
};
ここで、Cython を使用してこれら 2 つのクラスをインターフェースし、B インスタンスから getA() メソッドを呼び出すことができるようにしたいと考えています。
a = PyA()
b = PyB()
assert a.getA() == b.getA()
現在、pyx ファイルは次のようになっています。
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()
このコードがあまり危険なことをしていないことを願っていますが、それを処理するためのより良い方法があることも願っています。
また、モジュールを使用すると、次の出力が生成されます。
>>> 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
また、A インスタンスを割り当ててすぐに解放するのはあまり好きではありません。
正しく行う方法について何かアドバイスはありますか?