全部博文(2065)
分类: Python/Ruby
2010-06-10 12:44:47
python中weakref模块
时间:
依据这个模块程序员能够创建一个弱引用指向一个对象(PS:在JAVA里面如果一个对象没有被引用或只有弱引用的话就会被GC回收内存空间)
A primary use for
weak references is to implement caches or mappings holding large objects, where
it’s desired that a large
object not be kept alive solely because it appears in a cache or mapping.
弱引用用在大对象的
弱引用示例
>>> import weakref
>>> class Object:
... pass
...
>>> o = Object() 一个引用指向这个对象
>>> r = weakref.ref(o) 创建一个弱引用对象
>>> o2 = r()
>>> o is o2 当前这个对象与弱引用对象其实是一个
True
PS:一个对象会有其引用计数。就是说这个对象有多少个引用在引用它!当这个引用计数为0的时候就会被GC回收!
使用weakref模块,你可以创建到对象的弱引用,Python在对象的引用计数为0或只存在对象的弱引用时将回收这个对象。
一旦没有了对这个对象的其它的引用,调用弱引用将返回None,因为Python已经销毁了这个对象。
注意:大部分的对象不能通过弱引用来访问。
9.2、创建代理对象
代理对象是弱引用对象,它们的行为就像它们所引用的对象,这就便于你不必首先调用弱引用来访问背后的对象。通过weakref模块的proxy(obj[,callback])函数来创建代理对象。使用代理对象就如同使用对象本身一样:
>>> from socket import*
>>> import weakref
>>> s=socket(AF_INET,SOCK_STREAM)
>>> ref=weakref.proxy(s)
>>> s
instance at 007E4874>
>>> ref
instance at 007E4874>
>>> ref.close() #对象的方法同样工作
callback参数的目的和ref函数相同。在Python删除了一个引用的对象之后,使用代理将会导致一个weakref.ReferenceError错误:
>>> def s
>>> ref
Traceback (most recent call last):
File "", line 1, in ?
代理对象有什么好处?
跟引用它本身其实是一个样