弱引用对象

Python 支持将弱引用作为一等对象。有两种特定的对象类型直接实现弱引用。第一个是简单的引用对象,第二个尽可能充当原始对象的代理。

int PyWeakref_Check(PyObject *ob)

如果ob是引用或代理对象,则返回 true。此函数始终成功。

int PyWeakref_CheckRef(PyObject *ob)

如果ob是引用对象,则返回 true。此函数始终成功。

int PyWeakref_CheckProxy(PyObject *ob)

如果ob是代理对象,则返回 true。此函数始终成功。

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

PyObject *PyWeakref_GetObject(PyObject *ref)
返回值:借用引用。 稳定 ABI的一部分。

从弱引用ref返回引用的对象。如果引用的对象不再存在,则返回Py_None

注意

此函数返回对引用的对象的借用引用。这意味着你应该始终在对象上调用Py_INCREF(),除非它不能在借用引用最后一次使用之前被销毁。

PyObject *PyWeakref_GET_OBJECT(PyObject *ref)
返回值:借用引用。

类似于PyWeakref_GetObject(),但不进行错误检查。

void PyObject_ClearWeakRefs(PyObject *object)
稳定 ABI的一部分。

此函数由tp_dealloc处理程序调用以清除弱引用。

这会遍历object的弱引用,并为具有弱引用的引用调用回调。当所有回调都尝试过时,它会返回。