6
我用cython包裝了一個C++庫。在頭文件中,也有一些結構,從其他結構繼承,像這樣:Cython中的C++ Struct繼承
struct A {
int a;
};
struct B : A {
int b;
};
如何把這個看在我的cdef extern...
塊?
我用cython包裝了一個C++庫。在頭文件中,也有一些結構,從其他結構繼承,像這樣:Cython中的C++ Struct繼承
struct A {
int a;
};
struct B : A {
int b;
};
如何把這個看在我的cdef extern...
塊?
Using C++ in Cython沒有提什麼特殊:
#file: pya.pyx
cdef extern from "a.h":
cdef cppclass A:
int a
cdef cppclass B(A):
int b
包裝類:
#file: pya.pyx
cdef class PyB:
cdef B* thisptr
def __cinit__(self):
self.thisptr = new B();
def __dealloc__(self):
del self.thisptr
property a:
def __get__(self): return self.thisptr.a
def __set__(self, int a): self.thisptr.a = a
property b:
def __get__(self): return self.thisptr.b
def __set__(self, int b): self.thisptr.b = b
例子:
import pyximport; pyximport.install(); # pip install cython
from pya import PyB
o = PyB()
assert o.a == 0 and o.b == 0
o.a = 1; o.b = 2
assert o.a == 1 and o.b == 2
爲了建立它,你需要指示pyximport使用C++:
#file: pya.pyxbld
import os
from distutils.extension import Extension
dirname = os.path.dirname(__file__)
def make_ext(modname, pyxfilename):
return Extension(name=modname,
sources=[pyxfilename, "a.cpp"],
language="c++",
include_dirs=[dirname])
我可以只使用cppclass的結構?如果是這樣,它看起來像我可以做類繼承,並應該解決我的問題:http://wiki.cython.org/gsoc09/daniloaf/progress#Inheritance – colinmarc 2012-03-20 12:47:00
@colinmarc:我已經試過它在cython 0.15和它作品;該文檔可能會描述舊版本。在C++中''struct {..};'相當於'class {public:..};'。 – jfs 2012-03-20 13:14:18
感謝您的幫助! – colinmarc 2012-03-20 15:24:11