因此,用于编写扩展的 python 文档是这样说的:
“我们希望将我们的实例变量作为属性公开。有很多方法可以做到这一点。最简单的方法是定义成员定义:
static PyMemberDef Noddy_members[] = { {"first", T_OBJECT_EX, offsetof(Noddy, first), 0, "first name"}, {"last", T_OBJECT_EX, offsetof(Noddy, last), 0, "last name"}, {"number", T_INT, offsetof(Noddy, number), 0, "noddy number"}, {NULL} /* Sentinel */ };
并将定义放在 tp_members 槽中:
Noddy_members, /* tp_members */"
但是,我们已经将实例变量放入了 Noddy 结构体中:
typedef struct {
PyObject_HEAD
PyObject *first;
PyObject *last;
int number;
} Noddy;
所以我的问题是为什么我们把它们放在这两个地方。我的印象是,这是因为我们希望类型和实例都拥有它们,以便在实例更新后保留类型值。但是如果是这样的话,如果我们改变类属性,实例值是如何更新的呢?像这样:
>>> class foo(object): x = 4
...
>>> f = foo()
>>> f.x
4
>>> foo.x = 5
>>> f.x
5