2012-03-20 67 views
6

我用cython包裝了一個C++庫。在頭文件中,也有一些結構,從其他結構繼承,像這樣:Cython中的C++ Struct繼承

struct A { 
    int a; 
}; 
struct B : A { 
    int b; 
}; 

如何把這個看在我的cdef extern...塊?

回答

5

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]) 
+0

我可以只使用cppclass的結構?如果是這樣,它看起來像我可以做類繼承,並應該解決我的問題:http://wiki.cython.org/gsoc09/daniloaf/progress#Inheritance – colinmarc 2012-03-20 12:47:00

+0

@colinmarc:我已經試過它在cython 0.15和它作品;該文檔可能會描述舊版本。在C++中''struct {..};'相當於'class {public:..};'。 – jfs 2012-03-20 13:14:18

+0

感謝您的幫助! – colinmarc 2012-03-20 15:24:11