我正在学习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/

10-11 01:04