Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26323022
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Python/Ruby

2010-06-10 12:44:47

pythonweakref模块

时间:2010-6-10

依据这个模块程序员能够创建一个弱引用指向一个对象(PS:在JAVA里面如果一个对象没有被引用或只有弱引用的话就会被GC回收内存空间)

A primary use for weak references is to implement caches or mappings holding large objects, where its 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 ?

 

代理对象有什么好处?

跟引用它本身其实是一个样

 

阅读(1699) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~