我正在学习Cython,现在正在尝试。我尝试了基本的cdef类示例程序,它可以完美运行。
现在我要做的是在cdef类类型中混合使用cdef和非cdef属性
cdef class Context:
cdef public int byteIndex, bitIndex
def __init__(self, msg = "", msg_len = 0):
self.msg = msg
self.msg_len = msg_len
self.byteIndex = 0
self.bitIndex = 7
但是,一旦我实例化该对象,我就会报错
!! AttributeError: 'c_asnbase.Context' object has no attribute 'msg'
这是否意味着一旦您使用cdef定义了所有self。*属性的python类,就必须定义cdef了?
最佳答案
是的。这是在the documentation中明确声明的:
您可以通过将属性定义为object类型来愉快地存储字符串:
cdef public object msg
在内部,这样做的原因是
cdef class
没有字典,可以节省空间并加快属性访问的速度,但这确实意味着它不能在运行时添加任意属性。这与在常规Python类中使用__slots__
相当类似。关于python - 在cdef类中混合使用cdef和常规python属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42632297/