Python 模塊 Weakref

Python 模塊 Weakref

Python 的弱引用模塊 weakref 允許垃圾回收器(garbage collector)在一個對象沒有強引用的時候回收內存。

weakref 弱引用一個對象。強引用對象時,垃圾回收器不會回收對象的內存。這種情況也不總是需要的,例如一個緩存對象當不使用的情況下,可以暫時先被回收,釋放內存,在需要的情況下再創建。

弱引用 Reference


通過 ref() 方法弱引用一個對象

Python 模塊 Weakref

執行:

Python 模塊 Weakref

上例中,使用 ref() 方法返回弱引用 r,然後像函數一樣調用返回引用指向的對象。查看輸出,當用 del 語句刪除對象後,ref() 返回的對象就為 None 了。

引用回調


ref() 方法接收可選的第二個參數,回調函數(callback)。當不再引用對象時,調用此函數。

Python 模塊 Weakref

執行:

Python 模塊 Weakref

當 delete 對象後,callback() 函數調用,查看輸出,weakref ... dead引用對象已不在了。可以通過回調函數,清理一些資源。

為了更健壯的清理弱引用管理的資源,可以使用 finalize ,你可以傳遞給它要執行的函數,當引用的對象刪除時調用該函數,還可以傳遞一些參數。

Python 模塊 Weakref

執行:

Python 模塊 Weakref

代理 Proxy


有時候,使用代理(Proxy)更方便。上例中,使用 ref() 方法後,返回的是一個引用,還得像函數調用一下才可以訪問指向的對象。而代理可以直接訪問。

Python 模塊 Weakref

執行:

Python 模塊 Weakref

緩存對象


上面介紹了使用 ref() 或者 proxy() 弱引用單獨的對象。weakref 提供了更高級的 API:WeakKeyDictionary 和 WeakValueDictionary ,可以很方便的緩存多個對象。

Python 模塊 Weakref

執行:

Python 模塊 Weakref

上例中,創建了2個對象,分別用 refs 字典存儲引用和 WeakValueDicionary 存儲弱引用,當刪除所有強引用後,然後用垃圾回收器顯示的 collect(),最後弱引用也回收了。


分享到:


相關文章: