Cython 类 AttributeError。

4

我开始尝试使用Cython并遇到了以下问题。考虑以下代表3D空间中顶点的类:

#Vertex.pyx
cdef class Vertex(object):
    cdef double x, y, z
    def __init__(self, double x, double y, double z):        
        self.x = x
        self.y = y
        self.z = z

现在我尝试从Python控制台创建一个对象:

import Vertex as vt
v1 = vt.Vertex(0.0, 1.0, 0.0) 

代码本身运行良好。但是,当我尝试访问类属性时,我会收到一个AttributeError错误:

print v1.x
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-6-83d928d774b7> in <module>()
----> 1 print v1.x

AttributeError: 'Vertex.Vertex' object has no attribute 'x'

有什么原因导致这种情况发生?
1个回答

4

默认情况下,cdef属性只能从Cython内部访问。如果您在属性名称前面加上cdef public,则Cython将生成适当的属性以便从Python中访问。


关于相关问题的一些额外说明:

如果您在Cython内部收到相同的错误,则可能忘记告诉Cython您的实例变量(例如v1)的类型 - Cython本身可以轻松访问cdef属性,但只有当它知道该属性的类型时才知道它们。如果它只是一个变量,则cdef该变量。如果您尝试使用函数的返回值或索引列表等,则可以使用转换:<Vectex>(func()).x仅在确定类型时执行此操作。

您也可以通过cdef函数获得类似的错误,这些函数再次仅在Cython中可见。在这种情况下,cpdef使函数从Cython和Python都可见。但是,cpdef函数在某些方面是所有世界中最糟糕的选择(它们具有cdef函数和def函数的所有限制)-通常最好选择仅限于Cython(cdef)或Python(def)接口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接