python弱引用使用介绍,python引用,和许多其它的高级语言一样
python弱引用使用介绍,python引用,和许多其它的高级语言一样
和许多其它的高级语言一样,Python使用了垃圾回收器来自动销毁那些不再使用的对象。每个对象都有一个引用计数,当这个引用计数为0时Python能够安全地销毁这个对象。
使用weakref模块,你可以创建到对象的弱引用,Python在对象的引用计数为0或只存在对象的弱引用时将回收这个对象。
一、 创建弱引用
你可以通过调用weakref模块的ref(obj[,callback])来创建一个弱引用,obj是你想弱引用的对象,callback是一个可选的函数,当因没有引用导致Python要销毁这个对象时调用。回调函数callback要求单个参数(弱引用的对象)。
一旦你有了一个对象的弱引用,你就能通过调用弱引用来获取被弱引用的对象。下面的例子创建了一个对socket对象的弱引用:
>>> from socket import *>>> import weakref>>> s=socket(AF_INET,SOCK_STREAM)>>> ref=weakref.ref(s)>>> s<socket._socketobject instance at 007B4A94>>>> ref<weakref at 0x81195c; to 'instance' at 0x7b4a94> >>> ref() #调用它来访问被引用的对象<socket.socketobject instance at 007B4A94>
一旦没有了对这个对象的其它的引用,调用弱引用将返回None,因为Python已经销毁了这个对象。注意:大部分的对象不能通过弱引用来访问。
weakref模块中的getweakrefcount(obj)和getweakrefs(obj)分别返回弱引用数和关于所给对象的引用列表。
弱引用对于创建对象(这些对象很费资源)的缓存是有用的。
二、创建代理对象
代理对象是弱引用对象,它们的行为就像它们所引用的对象,这就便于你不必首先调用弱引用来访问背后的对象。通过weakref模块的proxy(obj[,callback])函数来创建代理对象。使用代理对象就如同使用对象本身一样:
>>> from socket import*>>> import weakref>>> s=socket(AF_INET,SOCK_STREAM)>>> ref=weakref.proxy(s)>>> s<socket._socketobject instance at 007E4874>>>> ref <socket._socketobject instance at 007E4874>>>> ref.close() #对象的方法同样工作
callback参数的目的和ref函数相同。在Python删除了一个引用的对象之后,使用代理将会导致一个weakref.ReferenceError错误:
>>> def s>>> refTraceback (most recent call last): File "<stdin>", line 1, in ?
弱引用使用的机会不是很多,一般用来进行 cache 编程。我们可以使用 weakref.ref() 来创建一个弱引用。
>>>> import sys>>> import weakref>>> class Class1: def test(self): print "test..." >>> o = Class1()>>> sys.getrefcount(o)2>>> r = weakref.ref(o) # 创建一个弱引用>>> sys.getrefcount(o) # 引用计数并没有改变2>>> r<weakref at 00D3B3F0; to 'instance' at 00D37A30> # 弱引用所指向的对象信息>>> o2 = r() # 获取弱引用所指向的对象>>> o is o2True>>> sys.getrefcount(o)3>>> o = None>>> o2 = None>>> r # 当对象引用计数为零时,弱引用失效。<weakref at 00D3B3F0; dead>de>
weakref 还提供了一个 proxy():
import sysimport weakrefclass Class1: def test(self): print "test" def callback(self): print "callback" o = Class1()p = weakref.proxy(o, callback)p.test()o = None
相关内容
- 用c扩展python代码示例,扩展python示例,搞了一晚上终于
- python守护进程例子,python守护进程,来自《python co
- python多线程死锁检测代码,python多线程代码,在多线程程
- python调用grep返回结果,python调用grep返回,下面的函数封
- python记录线程的存活时间,python线程存活,对于长期运行
- python实现逆波兰计算表达式,python波兰表达式,逆波兰表
- python实现封闭类(禁止继承),python封闭,python没有se
- python里的列表list使用范例代码,python范例,#list#新建列
- python winreg 示例,pythonwinreg,下面是关于_winreg
- python连接sql server数据库,pythonsql,首先,到http://p
评论关闭