python的WeakKeyDictionary類和weakref模塊的其他函數
# -*- coding: utf-8 -*- # @Author : ydf # @Time : 2019/6/13 13:18 import time import weakref from app.utils_ydf import nb_print class A(): def __init__(self,x): self._x = x def __repr__(self): return f'A類的{self._x}實例 {id(self)}' def __del__(self): nb_print(f'摧毀啦 {self._x} 。。。。') wd = dict() # wd = weakref.WeakKeyDictionary() a1 = A(1) a2 = A(2) wd[a1] = 'xxxxxxx' wd[a2] = 'yyyyyyy' nb_print('銷毀a1對象前') for item in wd.items(): nb_print(item) del a1 nb_print('銷毀a1對象后') for item in wd.items(): nb_print(item)
while 1:
time.sleep(10) # 阻止退出觸發del,導致不方便觀察
使用普通dict
使用 weakref.WeakKeyDictionary對比使用普通字典,可以看到不同的地方是銷毀a1后,普通字典中還有a1這個鍵,並且del a1時 無法觸發A類的__del__方法,。
除此之外還有weakvaluedictionary和weakset這些對象。
weakref里面的函數。
class TestObj: def __init__(self): self.xx = 666 def test_func(reference): nb_print('Hello from Callback function!') nb_print(reference, 'This weak reference is no longer valid') t = TestObj() # 建立一個a的弱引用 nb_print(t.xx) t_ref = weakref.ref(t, test_func) nb_print(t_ref().xx) t.xx = 777 nb_print(t_ref().xx) del t nb_print(t_ref().xx) # 可以發現用不了了。