将其他 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)