defget(self, key): r = self.pool.get(key) if r: # 调用弱引用对象,即可找到指向的对象 # 删除变量后,再次调用弱引用对象返回None data = r() if data: print(f'cache hits {key}, value is {data.value}') return data
print(f'cache set {key}') data = Data(key) # 创建一个指向该数据的弱引用 self.pool[key] = weakref.ref(data) return data
if __name__ == '__main__': cacher = Cacher()
data = cacher.get(1) data2 = cacher.get(1) print(data is data2)
defget(self, key): data = self.pool.get(key) if data: print(f'cache hits {key}, value is {data.value}') return data print(f'cache set {key}') self.pool[key] = data = Data(key) return data
if __name__ == '__main__': cacher = Cacher()
data = cacher.get(1) data2 = cacher.get(1) print(data is data2)
del data del data2 data3 = cacher.get(1)
4.使用限制
基本的 list 和 dict 实 例不能作为所指对象,但是它们的子类可以。
int 和 tuple 实例不能作 为弱引用的目标,甚至它们的子类也不行。
1 2 3 4 5 6 7 8 9 10 11
import weakref
i = 1
ref_i = weakref.ref(i)
$ Traceback (most recent call last): File "C:\test\main.py", line 5, in <module> ref_i = weakref.ref(i) TypeError: cannot create weak reference to 'int'object