Python 模块 Weakref

Python 的弱引用模块 weakref 允许垃圾回收器(garbage collector)在一个对象没有强引用的时候回收内存。

weakref 弱引用一个对象。强引用对象时,垃圾回收器不会回收对象的内存。这种情况也不总是需要的,例如一个缓存对象当不使用的情况下,可以暂时先被回收,释放内存,在需要的情况下再创建。

弱引用 Reference

通过 ref() 方法弱引用一个对象

执行:

上例中,使用 ref() 方法返回弱引用 r,然后像函数一样调用返回引用指向的对象。查看输出,当用 del 语句删除对象后,ref() 返回的对象就为 None 了。

引用回调

ref() 方法接收可选的第二个参数,回调函数(callback)。当不再引用对象时,调用此函数。

执行:

当 delete 对象后,callback() 函数调用,查看输出,weakref ... dead引用对象已不在了。可以通过回调函数,清理一些资源。

为了更健壮的清理弱引用管理的资源,可以使用 finalize ,你可以传递给它要执行的函数,当引用的对象删除时调用该函数,还可以传递一些参数。

执行:

代理 Proxy

有时候,使用代理(Proxy)更方便。上例中,使用 ref() 方法后,返回的是一个引用,还得像函数调用一下才可以访问指向的对象。而代理可以直接访问。

执行:

缓存对象

上面介绍了使用 ref() 或者 proxy() 弱引用单独的对象。weakref 提供了更高级的 API:WeakKeyDictionary 和 WeakValueDictionary ,可以很方便的缓存多个对象。

执行:

上例中,创建了2个对象,分别用 refs 字典存储引用和 WeakValueDicionary 存储弱引用,当删除所有强引用后,然后用垃圾回收器显示的 collect(),最后弱引用也回收了。

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();