弱引用对象

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.

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

参见

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

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

返回对象 ob 的一个弱引用代理对象。 该函数总是会返回一个新引用,但不保证创建一个新对象;它有可能返回一个现有的代理对象。 第二个形参 callback 可以是一个可调用对象,它会在 ob 被垃圾回收时接收通知;它应当接受一个单独形参,即弱引用对象本身。 callback 也可以为 None 或 NULL。 如果 ob 不是可弱引用的对象,则将引发 TypeError 并返回 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.

int PyWeakref_IsDead(PyObject *ref)

测试弱引用 ref 是否已死亡。如果该引用已死亡则返回 1,如果仍存活则返回 0,如果 ref 不是弱引用对象则返回 -1 并设置一个错误。

Added in version 3.14.

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

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

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

PyObject **PyObject_GET_WEAKREFS_LISTPTR(PyObject *object)

Return a pointer to an internal linked list of weak references to object. object must support weak references and must not be NULL.

This function is intended for internal use only. Do not access or modify the weak reference list through the returned pointer.

自 3.15.2 版起已处于 Soft deprecated 状态.

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

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

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

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

Added in version 3.13.