1. 程式人生 > >weakref模組和弱引用

weakref模組和弱引用

正是因為有引用,物件才會在記憶體中存在。當物件的引用數量歸零後,垃圾回收程式會把物件銷燬。

弱引用不會增加物件的引用數量,引用的目標物件稱為所指物件(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的實現細節。