我開始嘗試 Cython 并遇到以下問題。考慮以下表示 3D 空間中的頂點的類:#Vertex.pyxcdef 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 vtv1 = 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.xAttributeError: 'Vertex.Vertex' object has no attribute 'x'任何想法為什么會發生這種情況?
1 回答

繁星點點滴滴
TA貢獻1803條經驗 獲得超3個贊
默認情況下,cdef
屬性只能從 Cython 內部訪問。如果您將其設置cdef public
為屬性名稱前面的公共屬性,則 Cython 將生成合適的屬性以便能夠從 Python 訪問它。
關于相關問題的一些額外說明:
如果您在 Cython 中遇到同樣的錯誤,那么您可能忘記告訴 Cython 您的實例變量的類型(例如v1
)——Cython 本身可以愉快地訪問cdef
屬性,但它只有在知道類型時才知道它們。如果它只是一個變量,那么cdef
該變量。如果您嘗試使用函數的返回值,或索引列表或類似內容,則可以使用 cast: <Vectex>(func()).x
。僅當您確定類型時才執行此操作。
您可能會遇到類似的cdef
函數錯誤,這些錯誤再次僅在 Cython 中可見。在這種情況下cpdef
,該函數對 Cython 和 Python 都可見。但是,cpdef
函數在某些方面是最糟糕的(它們具有cdef
函數的所有限制和def
函數的所有限制) - 通常最好選擇 Cython-only ( cdef
) 或 Python ( def
) 接口。
添加回答
舉報
0/150
提交
取消