弱引用对象¶
Python 支持将弱引用作为一级对象。有两种特定的对象类型直接实现弱引用。第一种是简单的引用对象,第二种则尽可能地充当原始对象的代理。
- 
PyObject *PyWeakref_NewRef(PyObject *ob, PyObject *callback)¶
- 返回值: 新引用。 稳定ABI 的一部分。返回对象 ob 的弱引用对象。这将总是返回一个新的引用,但不能保证创建一个新的对象;可能会返回一个现有引用对象。第二个参数 callback 可以是一个可调用对象,当 ob 被垃圾回收时会收到通知;它应该接受一个参数,该参数将是弱引用对象本身。callback 也可以是 None或NULL。如果 ob 不是一个可弱引用的对象,或者如果 callback 不可调用,None或NULL,此函数将返回NULL并引发TypeError。
- 
PyObject *PyWeakref_NewProxy(PyObject *ob, PyObject *callback)¶
- 返回值: 新引用。 稳定ABI 的一部分。返回对象 ob 的弱引用代理对象。这将总是返回一个新的引用,但不能保证创建一个新的对象;可能会返回一个现有代理对象。第二个参数 callback 可以是一个可调用对象,当 ob 被垃圾回收时会收到通知;它应该接受一个参数,该参数将是弱引用对象本身。callback 也可以是 None或NULL。如果 ob 不是一个可弱引用的对象,或者如果 callback 不可调用,None或NULL,此函数将返回NULL并引发TypeError。
- 
int PyWeakref_GetRef(PyObject *ref, PyObject **pobj)¶
- 自 3.13 版本起成为 稳定 ABI 的一部分。从弱引用 ref 获取对被引用对象的强引用,存储到 *pobj 中。 - 成功时,将 *pobj 设置为对被引用对象的新强引用并返回 1。 
- 如果引用已失效,将 *pobj 设置为 - NULL并返回 0。
- 出错时,引发异常并返回 -1。 
 在 3.13 版本加入。 
- 
PyObject *PyWeakref_GetObject(PyObject *ref)¶
- 返回值: 借用引用。 稳定ABI 的一部分。从弱引用 ref 返回对被引用对象的借用引用。如果被引用对象不再存在,则返回 Py_None。备注 此函数返回对被引用对象的借用引用。这意味着除了在借用引用最后一次使用之前不能销毁对象的情况外,您应该始终对该对象调用 Py_INCREF()。自 3.13 版本弃用,并将在 3.15 版本中移除:请改用 PyWeakref_GetRef()。
- 
PyObject *PyWeakref_GET_OBJECT(PyObject *ref)¶
- 返回值:借用引用。类似于 PyWeakref_GetObject(),但不进行错误检查。自 3.13 版本弃用,并将在 3.15 版本中移除:请改用 PyWeakref_GetRef()。
- 
int PyWeakref_IsDead(PyObject *ref)¶
- 测试弱引用 ref 是否失效。如果引用失效,返回 1;如果引用有效,返回 0;如果 ref 不是弱引用对象,则返回 -1 并设置错误。 - 在 3.14 版本加入。 
- 
void PyObject_ClearWeakRefs(PyObject *object)¶
- 作为 稳定 ABI 的一部分。此函数由 tp_dealloc处理程序调用以清除弱引用。它遍历 object 的弱引用,并为那些具有回调的引用调用回调。当所有回调都已尝试时返回。 
- 
void PyUnstable_Object_ClearWeakRefsNoCallbacks(PyObject *object)¶
- 这是一个不稳定 API。它可能会在次要版本中未经警告而更改。清除 object 的弱引用而不调用回调。 此函数由具有终结器(即 __del__())的类型的tp_dealloc处理程序调用。这些对象的处理程序首先调用PyObject_ClearWeakRefs()以清除弱引用并调用其回调,然后是终结器,最后调用此函数以清除可能由终结器创建的任何弱引用。在大多数情况下,使用 PyObject_ClearWeakRefs()清除弱引用比使用此函数更合适。在 3.13 版本加入。