如何编写cython扩展类型的C ++构造函数?

时间:2019-01-21 19:42:23

标签: cython

如何修改cython将根据我在.pyx文件中定义的Cython扩展类型生成的C ++类构造函数,以免产生使用def __cinit__(self)的代价?假设我正在编译为C ++,而不是C。

我想做的就是像在C ++的初始化列表中那样设置默认值,并且可能在构造函数中运行一些代码而不与Python交互。看来__cinit__方法是在初始化C ++类成员并且C ++构造函数完成运行之后运行的。

this example中,

  

Cython使用空构造函数初始化cdef类的C ++类属性。

我假设这是指默认构造函数,因为C ++构造函数是无效构造函数。我还假设无论是否使用__cinit__方法,这种情况都会发生。

  

如果要包装的类没有null构造函数,则必须存储指向包装好的类的指针,然后手动分配和取消分配它。方便且安全的位置是 cinit dealloc 方法,这些方法保证在创建和删除Python实例后将被完全调用一次。

我有一个现有的类,该类在Py_XDECREF内的循环中的成员对象上调用__dealloc__。该对象保存指向Python对象的指针。当我转换为C ++代码时,带注释的HTML在定义__dealloc__方法的行中没有显示突出显示的黄色文本。这很有趣,因为__dealloc__也使用def定义。

但是,当我尝试初始化作为我定义的Cython Extension实例的成员(并且不是通过包装C ++代码创建的)时,__cinit__方法以黄色突出显示。

    def __cinit__(self):
        self._member = MyCyExt()

我想知道是否是因为我无法在纯C ++中初始化Cython扩展类型。我不知道为什么会这样,因为Cython默认会调用null构造函数。

This answer解决了这个问题,但是却增加了我要避免的开销。有没有一种方法可以在不增加开销的情况下,并实际上将构造函数本身写入.pyx文件中?

0 个答案:

没有答案