弱引用对象¶
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()
。
-
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 版本加入。