cython类,属性为python对象实例

时间:2016-01-14 15:23:55

标签: cython

我们有一个例子。

cdef class Example:
    attr2 = None
    cdef attr3
    cdef object attr4
    def __init__(self):
        self.attr1 = Obj()
        self.attr2 = Obj()
        self.attr3 = Obj()
        self.attr4 = Obj()

分配给 self.attr1 的行将引发 AttributeError ,说:“对象没有属性'attr1'

如果尝试使用 self.attr2 ,它也会引发异常,但会显示以下消息:“ object attribute'attr2'是只读的”。

如果使用关键字 cdef ,它没有显式类型,编译过程将失败。

如果使用 object 类型定义此属性,它看起来不错。但是 Example 类的不同实例将使这个 attr4 像一个单例,并且其中一个实例的任何交互对于其他实例都是可见的,在这种情况下,我想要让每个人都有一个唯一的Obj()实例。

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

class Obj(object):
    # At first I define a class Obj() to match your example
    def __init__(self):
        self.abc = 32
        self.xyz = "xyzxyz"

# Then I can define the Example class
cdef class Example:
    cdef public:
        object attr1, attr2, attr3, attr4
    def __init__(self):
        self.attr1 = Obj()
        self.attr2 = Obj()
        self.attr3 = Obj()
        self.attr4 = Obj()

它似乎是没有错误的cythonized /编译,你可以访问与Obj对象相关的属性:

In [11]:
a = Example()
a.attr1.abc
​
Out[11]:
32