我们有一个例子。
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()实例。
答案 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