【问题标题】:Cython class AttributeErrorCython 类 AttributeError
【发布时间】:2019-08-09 08:53:19
【问题描述】:

我已经开始尝试 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'

任何想法为什么会发生这种情况?

【问题讨论】:

    标签: python cython cythonize


    【解决方案1】:

    默认情况下,cdef 属性只能从 Cython 内部访问。如果you make it a public attribute 在属性名称前面带有cdef public,那么 Cython 将生成合适的属性,以便能够从 Python 访问它。


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

    如果您在 Cython 中遇到相同的错误,那么您可能忘记告诉 Cython 您的实例变量的类型(例如 v1) - Cython 本身可以愉快地访问 cdef 属性,但它只知道它们如果它知道类型。如果它只是一个变量,那么cdef 那个变量。如果您尝试使用函数的返回值、索引列表或类似内容,则可以使用强制转换:&lt;Vectex&gt;(func()).x只有在确定类型时才这样做。

    cdef 函数可能会出现类似错误,这些错误再次仅在 Cython 中可见。在这种情况下,cpdef 使函数对 Cython 和 Python 都可见。但是,cpdef 函数在某些方面是世界上最糟糕的(它们具有 cdef 函数的所有限制以及 def 函数的所有限制) - 你通常最好选择仅 Cython(@987654333 @) 或 Python (def) 接口。

    【讨论】:

      猜你喜欢
      • 2019-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多