弱引用对象

Python 支持“弱引用”作为一类对象。具体来说,有两种直接实现弱引用的对象。第一种就是简单的引用对象,第二种尽可能地作用为一个原对象的代理。

int PyWeakref_Check(PyObject *ob)

如果 ob 是一个引用或代理对象则返回非零值。此函数总是会成功执行。

int PyWeakref_CheckRef(PyObject *ob)

如果 ob 是一个引用对象或引用类型的子类则返回非零值。此函数总是会成功执行。

int PyWeakref_CheckRefExact(PyObject *ob)

如果 ob 是一个引用对象,但不是引用类型的子类则返回非零值。此函数总是会成功执行。

int PyWeakref_CheckProxy(PyObject *ob)

如果 ob 是一个代理对象则返回非零值。此函数总是会成功执行。

PyObject *PyWeakref_NewRef(PyObject *ob, PyObject *callback)
返回值:新的引用。 属于 稳定 ABI.

Return a weak reference object for the object ob. This will always return a new reference, but is not guaranteed to create a new object; an existing reference object may be returned. The second parameter, callback, can be a callable object that receives notification when ob is garbage collected; it should accept a single parameter, which will be the weak reference object itself. callback may also be None or NULL. If ob is not a weakly referenceable object, this will raise TypeError and return NULL.

参见

PyType_SUPPORTS_WEAKREFS() 用于检测 ob 是否可被弱引用。

PyObject *PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
返回值:新的引用。 属于 稳定 ABI.

Return a weak reference proxy object for the object ob. This will always return a new reference, but is not guaranteed to create a new object; an existing proxy object may be returned. The second parameter, callback, can be a callable object that receives notification when ob is garbage collected; it should accept a single parameter, which will be the weak reference object itself. callback may also be None or NULL. If ob weakly referenceable object, this will raise TypeError and return NULL.

参见

PyType_SUPPORTS_WEAKREFS() 用于检测 ob 是否可被弱引用。

int PyWeakref_GetRef(PyObject *ref, PyObject **pobj)
属于 稳定 ABI 自 3.13 版起.

基于一个弱引用 ref 获取一个指向被引用对象的 strong reference 存入到 *pobj

  • 成功时,将 *pobj 设为一个新的指向被引用对象的 strong reference 并返回 1。

  • 如果引用不可用,则将 *pobj 设为 NULL 并返回 0。

  • 发生错误时,将引发异常并返回 -1。

Added in version 3.13.

PyObject *PyWeakref_GetObject(PyObject *ref)
返回值:借入的引用。 属于 稳定 ABI.

基于一个弱引用 ref 返回一个指向被引用对象的 borrowed reference。如果引用已不可用,则返回 Py_None.

备注

该函数返回被引用对象的一个 borrowed reference。这意味着应该总是在该对象上调用 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 并设置一个错误。

Added in version 3.14.

void PyObject_ClearWeakRefs(PyObject *object)
属于 稳定 ABI.

此函数将被 tp_dealloc 处理器调用以清空弱引用。

此函数将迭代 object 的弱引用并调用这些引用中可能存在的回调。它将在尝试了所有回调之后返回。

void PyUnstable_Object_ClearWeakRefsNoCallbacks(PyObject *object)
这是 不稳定 API。它可能在次要版本中不经警告地被更改。

清空 object 的弱引用而不调用回调。

此函数将由 tp_dealloc 处理器针对带有终结器 (即 __del__()) 的类型进行调用。针对这些对象的处理器会先调用 PyObject_ClearWeakRefs() 来清空弱引用并调用其回调,然后调用终结器,最后调用此函数来清空终结器可能创建的任何弱引用。

在大多数情况下,更适当的做法是使用 PyObject_ClearWeakRefs() 而不是此函数来清空弱引用。

Added in version 3.13.