Weak references
前言:
_weakref_模块允许python开发者创建弱引用对象。
再接下来中,术语referent代表被弱引用所引用的对象。
一个弱引用对于对象是不能够保持对象存活的:当仅剩下_referent_的引用都是弱引用时,垃圾回收机制是可以自由销毁_referent_然后重新使用内存的。然而,直到对象被真正销毁之前,弱引用可能返回一个对象,即使它没有强引用。
弱引用的主要用处是实现缓存和映射保持大型对象,期望大型对象不能仅仅因为出现在缓存或映射中而保持存活。
举个栗子,如果你有一些大型二进制image对象,你可能希望用name与每个image关联起来。如果你用python中的字典去映射names对images,或者images对names。image对象将仍然存活仅仅因为它作为key值或value值存放在字典中。 _weakref_中的_WeakKeyDictionary_和_WeakValueDictionary_是另一种选择,使用弱引用会构造映射,映射不会仅因为对象出现在映射中而保持存活。再举个栗子,一个image对象作为value存放于_WeakValueDictionary_中,当image对象最后的引用时弱映射中的弱引用时,垃圾回收机制会回收对象,在弱映射中对应的条目也会被删除。
_WeakKeyDictionary_和_WeakValueDictionary_使用弱引用实现,设置回调方法,当弱字典的key或value被垃圾回收机制回收时会通知弱字典。_WeakSet_实现了_set_接口,但是对它的元素却保持了弱引用,就像_WeakKeyDictionary_一样。
finalize提供了一个直接的方式注册清理函数,当对象被垃圾回收是调用,这比在原始的弱引用上设置回调函数更简单,因为该模块自动确保终结器在对象被收集之前仍然存活。大多是程序发现使用弱类型或finalize是所需要的,低级别机器由weakref模块公开,以获得高级应用的好处。但是并不是所有的对象都可以被弱引用的;可以引用的包括类实例、Python中的方法(不在C中)、实例方法、集合、frozensets、一些文件对象、生成器、类型对象、sockets、arrays、dequeues、正则、代码对象。
更改再version 3.2: 添加支持thread.lock, threading.Lock, and code objects。
一些内置类型,如list和dict不直接支持弱引用,但是可以通过子类添加支持。
class Dict(dict): pass obj = Dict(red=1, green=2, blue=3) # this object is weak referenceable
其他内置类型,如tuple和int,即使在子类化时也不支持弱引用(这是一个实现细节,可能在不同的Python实现中是不同的)。扩展类型可以很容易地支持弱引用。
使用:
1、weakref.``ref
(_object_[, _callback_])