弱引用对象

Python 支持将弱引用作为一级对象。有两种特定的对象类型直接实现弱引用。第一种是简单的引用对象,第二种则尽可能地充当原始对象的代理。

int PyWeakref_Check(PyObject *ob)

如果 ob 是引用对象或代理对象,则返回非零值。此函数总是成功的。

int PyWeakref_CheckRef(PyObject *ob)

如果 ob 是引用对象,则返回非零值。此函数总是成功的。

int PyWeakref_CheckProxy(PyObject *ob)

如果 ob 是代理对象,则返回非零值。此函数总是成功的。

PyObject *PyWeakref_NewRef(PyObject *ob, PyObject *callback)
返回值: 新引用。 稳定ABI 的一部分。

返回对象 ob 的弱引用对象。这将总是返回一个新的引用,但不能保证创建一个新的对象;可能会返回一个现有引用对象。第二个参数 callback 可以是一个可调用对象,当 ob 被垃圾回收时会收到通知;它应该接受一个参数,该参数将是弱引用对象本身。callback 也可以是 NoneNULL。如果 ob 不是一个可弱引用的对象,或者如果 callback 不可调用,NoneNULL,此函数将返回 NULL 并引发 TypeError

PyObject *PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
返回值: 新引用。 稳定ABI 的一部分。

返回对象 ob 的弱引用代理对象。这将总是返回一个新的引用,但不能保证创建一个新的对象;可能会返回一个现有代理对象。第二个参数 callback 可以是一个可调用对象,当 ob 被垃圾回收时会收到通知;它应该接受一个参数,该参数将是弱引用对象本身。callback 也可以是 NoneNULL。如果 ob 不是一个可弱引用的对象,或者如果 callback 不可调用,NoneNULL,此函数将返回 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 版本加入。