我有一个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字段。我尝试过编写一个存取方法,结果相同。在这种情况下如何创建复制构造函数?
答案 0 :(得分:6)
在使用cdef
类时,属性访问被编译为C struct成员访问。因此,要访问对象cdef
的{{1}}成员,您必须确定A
的类型。在A
中,您没有告诉Cython其他是__cinit__
的实例。因此,Cython拒绝编译StructName
。要解决问题,请写下
other.__structname
注意:def __cinit__(self, StructName other = None):
相当于None
,因此被接受为NULL
。
如果你想要更多的多态,那么你必须依赖于类型转换:
StructName