python - Cython 类 AttributeError
问题描述
我已经开始尝试 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
属性,但它只有在知道类型时才知道它们。如果它只是一个变量,那么cdef
那个变量。如果您尝试使用函数的返回值、索引列表或类似内容,则可以使用强制转换:<Vectex>(func()).x
。仅当您确定该类型时才执行此操作。
您可以使用函数获得类似的错误cdef
,这些错误再次仅在 Cython 中可见。在这种情况下cpdef
,使函数对 Cython 和 Python 都可见。但是,cpdef
在某些方面,函数是最糟糕的(它们具有cdef
函数的所有限制和函数的所有限制def
)——您通常最好选择仅 Cython ( cdef
) 或 Python ( def
) 接口。
推荐阅读
- android - 发现多个文件具有独立于操作系统的路径“builddef.lst”(googlecode.mp4parser:isoparser:)
- wso2 - 为芭蕾舞女演员中央包获取更新时出错
- svg - SVG甜甜圈切片在悬停时改变颜色
- python - 如何展平多级/嵌套 JSON?
- python - 按值降序然后键降序对字典进行排序
- jquery - 检查何时按下 Enter 键
- pyspark - Pyspark 错误:py4j.java_gateway:尝试连接到 Java 服务器时发生错误(127.0.0.1:50532)
- visual-studio - 在 Visual Studio 中集成 Crashlytics?
- python - AttributeError:“张量”对象在实施共同注意层期间没有属性“_keras_history”
- javascript - javascript:window.location 自动更改包含的链接