weakref模組和弱引用
阿新 • • 發佈:2018-11-11
正是因為有引用,物件才會在記憶體中存在。當物件的引用數量歸零後,垃圾回收程式會把物件銷燬。
弱引用不會增加物件的引用數量,引用的目標物件稱為所指物件(referent)。常作快取使用。
一般我門會使用weakref包的集合(WeakKeyDictionary, WeakValueDictionary, WeakSet)和finalize,一般低層介面weakref.ref我門不建議使用。
WeakKeyDictionary 是一種可變對映,值是物件裡面的弱引用。
class Cheese: def __init__(self, kind): self.kind= kind def __repr__(self): return 'Cheese(%r)' % self.kind import weakref stock = weakref.WeakValueDictionary() catalog = [Cheese('Red Lercier'), Cheese('Tielet'), Cheese('Brei'), Cheese('Pramene')] for cheese in catalog: stock[cheese.kind] = cheese print(sorted(stock.keys())) # ['Brei', 'Pramene', 'Red Lercier', 'Tielet']del catalog print(sorted(stock.keys())) # ['Pramene'] 確實由於刪除了catalog,大部分內容沒有了del cheese # cheese這裡是全域性變數 是最後引用 print(sorted(stock.keys())) # []
WeakKeyDictionary 可以為應用中的其他部分擁有的物件附加資料,這樣就無需為物件新增屬性。這對覆蓋屬性訪問許可權的物件尤其有用。
WeakSet 可以儲存元素的弱引用集合類。元素沒有強引用時,集合會把它刪除。如果需要維護所有例項狀態的類,好的方案就是建立WeakSet型別屬性,儲存例項的引用。
弱引用的侷限
基本的list和dict例項不能作為所指物件,但它們的子類可以輕鬆的解決這個問題。int和tuple例項不能作為弱引用目標,甚至子類也不行,原因是基於CPython的實現細節。