将其他 Cython 绑定对象传递给 Cython 绑定对象上的方法
Passing other Cython-bound objects to methods on a Cython-bound object
我有一个 Cython class,它绑定到一个名为 TagDetector
的 C 库,我还有另一个 class TagFamily
,我想要能够实例化并传递这样的消息:
td = TagDetector()
td.add_family(TagFamily('tag16h5'))
TagFamily 在内部使用 C 库中的结构创建函数来设置指针变量 self._tag_family
。
我如何在 TagDetector
上创建一个方法,我可以将 TagFamily
传递给它,然后提取 _tag_family
结构并用它做一些事情?
只需要将参数的类型声明为TagFamily
类型,即可访问所有属性。此外,您可能还想阻止用户传递 None
,这可以通过添加 not None
来完成。请注意,您示例中的 TagFamily
实例将在调用 add_family
后被解构。因为你的 c 结构也应该被删除,如果你想在 add_family 结束后继续使用 c 结构,你需要防止这种情况。从你的例子我猜你的 TagDetector
将保存一个家庭列表,如果这是真的,避免这些内存管理问题的最简单方法是给 TagDetector
一个包含引用的 Python 列表TagDetector
中的所有标签系列。示例:
cdef class TagDetector:
cdef list families
def __init__(self):
self.families = []
def add_family(self, TagFamily family not None):
# prevent family from being deconstructed after add_family returns
self.families.append(family)
my_c_function(family._tag_family)
我有一个 Cython class,它绑定到一个名为 TagDetector
的 C 库,我还有另一个 class TagFamily
,我想要能够实例化并传递这样的消息:
td = TagDetector()
td.add_family(TagFamily('tag16h5'))
TagFamily 在内部使用 C 库中的结构创建函数来设置指针变量 self._tag_family
。
我如何在 TagDetector
上创建一个方法,我可以将 TagFamily
传递给它,然后提取 _tag_family
结构并用它做一些事情?
只需要将参数的类型声明为TagFamily
类型,即可访问所有属性。此外,您可能还想阻止用户传递 None
,这可以通过添加 not None
来完成。请注意,您示例中的 TagFamily
实例将在调用 add_family
后被解构。因为你的 c 结构也应该被删除,如果你想在 add_family 结束后继续使用 c 结构,你需要防止这种情况。从你的例子我猜你的 TagDetector
将保存一个家庭列表,如果这是真的,避免这些内存管理问题的最简单方法是给 TagDetector
一个包含引用的 Python 列表TagDetector
中的所有标签系列。示例:
cdef class TagDetector:
cdef list families
def __init__(self):
self.families = []
def add_family(self, TagFamily family not None):
# prevent family from being deconstructed after add_family returns
self.families.append(family)
my_c_function(family._tag_family)