One of the goals of Python 弱引用实现的目标之一是允许任意类型参与弱引用机制而不会在重视性能的对象(例如数字)上产生额外开销。
参见 weakref 模块的文档。
对于可以被弱引用的对象,扩展类型必须设置 tp_flags 字段的 Py_TPFLAGS_MANAGED_WEAKREF 位。 旧式的 tp_weaklistoffset 字段应当保持为零。
具体地说,以下就是静态声明的类型对象的样子:
static PyTypeObject TrivialType = {
PyVarObject_HEAD_INIT(NULL, 0)
/* ... other members omitted for brevity ... */
.tp_flags = Py_TPFLAGS_MANAGED_WEAKREF | ...,
};
唯一的额外补充是 tp_dealloc 需要清除任何弱引用 (通过调用 PyObject_ClearWeakRefs()):
static void
Trivial_dealloc(TrivialObject *self)
{
/* Clear weakrefs first before calling any destructors */
PyObject_ClearWeakRefs((PyObject *) self);
/* ... remainder of destruction code omitted for brevity ... */
Py_TYPE(self)->tp_free((PyObject *) self);
} |