弱引用对象¶
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()
。
-
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 中添加。