弱引用物件

Python 支援將弱引用作為一級物件。有兩種特定的物件型別直接實現弱引用。第一種是簡單的引用物件,第二種則儘可能地充當原始物件的代理。

int PyWeakref_Check(PyObject *ob)

如果 ob 是引用物件或代理物件,則返回非零值。此函式總是成功的。

int PyWeakref_CheckRef(PyObject *ob)

如果 ob 是引用物件,則返回非零值。此函式總是成功的。

int PyWeakref_CheckProxy(PyObject *ob)

如果 ob 是代理物件,則返回非零值。此函式總是成功的。

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

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 版本加入。