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

时间:2015-03-09 17:36:06

标签: python design-patterns cython

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

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

我想使用Python列表来保存Cython扩展类型的列表,因为我听说它是​​最简单的方法,并且通过Cython访问Python列表是有效的。

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

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

我理解正确吗?

2 个答案:

答案 0 :(得分:2)

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

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)。

查看有关attributes of extension types的文档以获取更多详细信息,properties部分的第二个示例还提供了扩展类型如何在不提供直接访问权限的情况下包装列表的示例。

答案 1 :(得分:0)

我不知道Cython扩展类型的任何此类限制。但是,从standard documentation on general extension types开始,您可以在扩展类型中创建任意PyObject作为成员变量(请参阅the Noddy2 example,其中包含无限制PyObject成员{{ 1}}和first后来被细化为限制为字符串类型)。如果您使用此路线,则可以将成员公开为last并按惯例传递PyObject或将其完全限制为list