弱引用对象

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()

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 中添加。