python弱引用使用介绍
来源:互联网 发布:巨人网络a股上市 编辑:程序博客网 时间:2024/06/06 10:52
和许多其它的高级语言一样,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
- python弱引用使用介绍
- jsonwidget-python使用介绍
- Python-UiAutomator使用介绍
- python的弱引用
- 使用Maven管理Spring (引用包介绍)
- python 引用,拷贝,对象回收,弱引用
- java中的四种引用介绍,强引用,软引用,弱引用,虚引用
- 强引用,软引用,弱引用,虚引用的使用
- 使用Python开发CouchDB介绍
- python gflags介绍与使用
- python paramiko模块使用介绍
- python使用sqlite简单介绍
- Python(一)介绍、安装、使用
- Python中的MySQLConnector使用介绍
- JAVA — 强引用 软引用 弱引用 虚引用 介绍
- 强引用、软引用、弱引用、以及虚引用简单介绍
- python数字类型介绍以及创建数字值对象引用、删除数字值引用操作实例
- Android中的软引用(SoftRefrerence)和弱引用(WeakReference)介绍
- ubuntu live cd修复grub引导项
- How Many Nines (前缀和 + 模拟日期)
- LA 4794(dp+枚举子集)分享巧克力
- ARM定时器
- 进程相关知识的整理
- python弱引用使用介绍
- PHP实现生成word文档
- Log4J入门教程(一) 入门例程
- Wi-Fi CSI的那些事(一)
- 图的邻接表表示法
- jboss小结
- 面试题58:二叉树的下一个结点
- Zookeeper源码解析——快速选举流程
- 可重入函数