Cython - 复制构造函数

时间:2014-02-04 01:41:40

标签: cython

我有一个C库,我正在尝试用Cython包装。我正在创建的一个类包含一个指向C结构的指针。我想编写一个复制构造函数,它将创建指向同一C结构的第二个Python对象,但是我遇到了麻烦,因为指针无法转换为python对象。

以下是我想要的内容草图:

cdef class StructName:
     cdef c_libname.StructName* __structname

     def __cinit__(self, other = None):
         if not other:
             self.__structname = c_libname.constructStructName()
         elif type(other) is StructName:
             self.__structname = other.__structname

真正的问题是最后一行 - 似乎Cython无法从python方法中访问cdef字段。我尝试过编写一个存取方法,结果相同。在这种情况下如何创建复制构造函数?

1 个答案:

答案 0 :(得分:6)

在使用cdef类时,属性访问被编译为C struct成员访问。因此,要访问对象cdef的{​​{1}}成员,您必须确定A的类型。在A中,您没有告诉Cython其他是__cinit__的实例。因此,Cython拒绝编译StructName。要解决问题,请写下

other.__structname

注意:def __cinit__(self, StructName other = None): 相当于None,因此被接受为NULL

如果你想要更多的多态,那么你必须依赖于类型转换:

StructName