Cython类 AttributeError[英] Cython class AttributeError

本文是小编为大家收集整理的关于Cython类 AttributeError的处理方法,想解了Cython类 AttributeError的问题怎么解决?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属性,但只知道它们如果知道类型.如果只是一个变量,则该变量.如果您尝试使用函数中的返回值,或索引列表或类似的索引,则可以使用cast:<Vectex>(func()).x. 仅在您确定类型时才这样做.

您可以使用cdef函数获得类似的错误,这些函数仅在Cython中才能看到.在这种情况下,cpdef使该功能从Cython和Python都可以看到.但是,cpdef函数在某些方面是最糟糕的世界(它们具有cdef函数的所有局限性和def函数的所有局限性) - 通常,您通常更好地选择仅Cython()或python(def)接口.

本文地址:https://www.itbaoku.cn/post/1793832.html