Python 中弱引用(weakref)的用途
Python 中 weakref 模块的作用是什么?弱引用和强引用有什么区别?在什么场景下使用弱引用?
回答
我是大山
弱引用不增加对象的引用计数,不影响对象的生命周期。当所有强引用消失后,弱引用自动失效。
import weakref
class Data:
pass
d = Data()
ref = weakref.ref(d)
print(ref()) # <__main__.Data object at 0x...> 对象还在
del d
print(ref()) # None 对象已回收
使用场景:
- 缓存:弱引用字典(
weakref.WeakValueDictionary)自动清理失效条目
class Cache:
def __init__(self):
self._cache = weakref.WeakValueDictionary()
def get(self, key):
return self._cache.get(key)
def set(self, key, value):
self._cache[key] = value
-
防止循环引用:父类强引用子类,子类弱引用父类
-
回调注册:
weakref.WeakMethod避免方法回调阻止对象回收 -
最终化:
weakref.finalize注册对象回收时的回调