使用来自 Cython 构造函数的参数初始化 C++ 对象

Initialize C++ object with arguments from Cython constructor

我已经在 C++ 中实现了 filter class,我正在努力用 Cython 包装它以便在 Python 中使用。 Cython MyFilter class 目前看起来像这样。

cdef class MyFilter:
    cdef filter f;
    def __cinit__(self, list array_sizes):
        cdef vector[size_t] as = array_sizes
        self.f.init(as)
    def add(self, uint32_t value):
        self.f.add(value)
    def get(self, uint32_t value):
        return self.f.get(value)

最初,C++ class 有一个单独的构造函数,它将 std::vector<size_t> 作为参数。但是为了使 Cython 包装器工作,我必须定义一个默认的无参数构造函数,然后添加一个 init() 函数来在参数从 __cinit__ 构造函数可用时初始化对象。这给 C++ 代码增加了一些不必要的复杂性。

是否有更清洁或更好的方法来做到这一点?如有必要,我想避免指点,但可能会被令人信服的论据说服。

实际上,您的解决方案是更清洁更好的方法:)

另一个解决方案是添加一个重载的构造函数,然后您可以从 init 调用它。:

cdef cppclass myclass:
    myclass() except +
    myclass(args) except +

然后添加到你的pythonclass

cdef class myPyClass:
    cdef myclass pclass
    def __cinit__(self,args):
        pclass = new myclass(args)