Cython:一个类需要有一个Cython扩展类型的python列表作为其属性——因此,这个类本身不能是扩展类型吗?

Cython:一个类需要有一个Cython扩展类型的python列表作为其属性——因此,这个类本身不能是扩展类型吗?,python,design-patterns,cython,Python,Design Patterns,Cython,假设我有一个名为Point的Cython扩展类型 然后,我需要创建一个名为Points的类,它的属性之一是Point对象的Python列表。现在,据我所知,Python列表不能是扩展类型的属性,因为只有C数据类型可以 我想使用Python列表保存Cython扩展类型列表,因为我听说这是最简单的方法,通过Cython访问Python列表是非常有效的 因此,点必须是普通的Python/Cython类,而不是扩展类型,对吗?这样,我可以做到以下几点: def class Points: def

假设我有一个名为
Point
的Cython扩展类型

然后,我需要创建一个名为
Points
的类,它的属性之一是
Point
对象的Python列表。现在,据我所知,Python列表不能是扩展类型的属性,因为只有C数据类型可以

我想使用Python列表保存Cython扩展类型列表,因为我听说这是最简单的方法,通过Cython访问Python列表是非常有效的

因此,
必须是普通的Python/Cython类,而不是扩展类型,对吗?这样,我可以做到以下几点:

def class Points:
    def __init__(self, num_points):
        self.points = [Point() for x in range(num_points)]

我理解正确吗?

我不知道Cython扩展类型有任何这样的限制。但是,从中可以清楚地看到,您可以创建任意的
PyObject
s作为扩展类型中的成员变量(请参见带有不受限制的
PyObject
members
first
last
,这些变量后来被细化为限制为字符串类型)。如果您采用这种方式,您可以将一个成员公开为
PyObject
,并按照约定传递给它一个
列表
,或者完全限制它为
列表

不,没有这样的限制,Cython扩展类型可以将任意Python对象作为属性。例如,您可以通过以下方式声明
类:

cdef class Points:
    cdef list points
    def __init__(self, num_points):
        self.points = [Point() for x in range(num_points)]
请注意,您需要提前声明Cython扩展类型的所有属性。如果不想将属性限制为特定的Python对象,也可以使用
object
而不是
list
。如果要将points属性公开给Python,即允许直接从Python访问,则需要将其声明为
public
(即
cdef public list points


请查看关于的文档以了解更多详细信息,本节的第二个示例还提供了一个示例,说明扩展类型如何在不提供直接访问的情况下包装列表。

Cython扩展类型可能与Python扩展类型不同?这几乎肯定是正确的,但是在这种情况下,我怀疑如果您需要这样的内置属性,那么坚持标准文档中描述的方法会更好。