问题描述
我已经开始尝试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'
有什么想法为什么会发生这种情况?
推荐答案
默认情况下,cdef属性仅在Cython内才能访问.如果您将成为公共属性 cdef public在属性名称的前面,Cython将生成合适的属性,能够从Python访问它.
有关相关问题的一些额外说明:
如果您从Cython中遇到相同的错误,那么您可能已经忘记了Cython的实例变量类型(例如v1) - Cython本身可以愉快地访问cdef属性,但只知道它们如果知道类型.如果只是一个变量,则该变量.如果您尝试使用函数中的返回值,或索引列表或类似的索引,则可以使用cast:<Vectex>(func()).x. 仅在您确定类型时才这样做.
您可以使用cdef函数获得类似的错误,这些函数仅在Cython中才能看到.在这种情况下,cpdef使该功能从Cython和Python都可以看到.但是,cpdef函数在某些方面是最糟糕的世界(它们具有cdef函数的所有局限性和def函数的所有局限性) - 通常,您通常更好地选择仅Cython(
相关问答
cython attributeError:'module'对象没有属性'声明'
导入 cython 函数:AttributeError: 'module' 对象没有属性 'fun'
为 cython 包装枚举类
类上的DELATTR生成意外的AttributeError
Python AttributeError:类没有属性
Cython和C++类构造函数
Cython:用嵌套Typedef公开C ++类
Cython带有类方法的回调
attributeError:键入对象'pandana.cyaccess.cyaccess'没有属性'__reduce_cython__'
Python AttributeError:类对象没有属性