weakref
weakref
模块允许Python程序员创建对对象的弱引用。
对对象的弱引用不足以使对象保持活动状态:当对引用的唯一剩余引用是弱引用时, 垃圾收集可以自由地销毁引用并将其内存重用于其他内容。但是,在实际销毁对象之前,弱引用可能会返回对象,即使没有对它的强引用也是如此。
弱引用的主要用途是实现保存大对象的高速缓存或映射,其中希望大对象不能仅仅因为它出现在高速缓存或映射中而保持活动。
常用
-
weakref.ref(object [,callback ])
返回对象object的弱引用。如果指示对象仍然存在,则可以通过调用引用对象来检索原始对象; 如果指示对象不再存在,则调用引用对象将返回
None
。如果提供了callback且不返回None
,并且返回的weakref对象仍然存活,则在对象即将销毁时将调用回调; 弱引用对象将作为唯一参数传递给回调; 指示对象将不再可用。>>> import weakerf >>> >>> class A: ... desc = 'weakref test.' ... >>> a = A() >>> r = weakref.ref(a) >>> r <weakref at 0x0000027DF702B958; to 'A' at 0x0000027DF71A8A58> >>> a <__main__.A object at 0x0000027DF71A8A58> >>> r()#使用函数调用方式访问所指对象 <__main__.A object at 0x0000027DF71A8A58> >>> a == r() True >>> r().desc 'weakref test.' >>> del a >>> r()#None >>> r <weakref at 0x0000027DF702B958; dead>
弱引用对象在所指对象销毁时调用回调函数,弱引用对象将作为唯一参数传递给回调
>>> a = A() >>> r = weakref.ref(a,lambda r:print("when delete,callback(%r)"%r)) >>> r().desc 'weakref test.' >>> del a when delete,callback(<weakref at 0x0000027DF71BB728; dead>) >>>
-
weakref.proxy(object [, callback])
返回对对象的弱引用(代理对象)。如果引用对象仍处于活动状态,则可以通过调用引用对象来检索原始对象;如果引用对象不再处于活动状态,则调用引用对象将导致不返回任何对象。callback参数与weakref.ref一致。
有时候,使用代理(Proxy)更方便。上例中,使用 ref() 后,返回的是一个引用,还得像函数调用一下才可以访问指向的对象,而代理可以直接访问。
>>> a = A() >>> r = weakref.ref(a) >>> p = weakref.proxy(a) >>> p == r() True >>> p.desc 'weakref test.'
-
weakref.finalize(obj,func,*args,**kwargs)
为了更健壮的清理弱引用管理的资源,可以使用 weakref.finalize ,你可以传递给它要执行的函数,当引用的对象删除时调用该函数,还可以传递一些参数。
>>> class Student: ... def __init__(self,name,gender,grade): ... self.name = name ... self.gender = gender ... self.grade = grade ... >>> s = Student('Tom','male',3) >>> def finalize(*args,**kwargs): ... print("finalize {!r} {!r}".format(args,kwargs)) ... >>> r = weakref.finalize(s,finalize,1,2,3,age=8) >>> del s finalize (1, 2, 3) {'age': 8} >>>
-
weakref.WeakKeyDictionary([dict])
使用弱引用作为key的映射类:当不再有对key的强引用时,将丢弃字典中的条目。
WeakKeyDictionary.keyrefs()返回key弱引用的可迭代对象。
>>> class C: ... def __init__(self,desc): ... self.desc = desc ... ... def __repr__(self): ... return 'C<{}>'.format(self.desc) ... >>> c1 = C('one') >>> c2 = C('two') >>> wkdict = weakref.WeakKeyDictionary() >>> wkdict[c1] = 1 >>> wkdict[c2] = 2 >>> wkdict.keyrefs() [<weakref at 0x00000257A8056728; to 'C' at 0x00000257A8067A20>, <weakref at 0x00000257A8056778; to 'C' at 0x00000257A80677B8>] >>> for k, v in wkdict.items(): ... print(k) ... C<one> C<two> >>> del c1 >>> for k, v in wkdict.items(): ... print(k) ... C<two> >>>
-
weakref.WeakValueDictionary([dict])
使用弱引用作为value的映射类:当不再有对value的强引用时,将丢弃字典中的条目。
与weakref.WeakKeyDictionary功能类似,只不过作为弱引用的是value。
WeakValueDictionary.valuerefs()返回value弱引用的可迭代对象。
-
weakref.WeakSet([element])
保存弱引用对象的类,其元素都为弱引用。当不再存在对某元素的强引用时,将丢弃该元素。
-
weakref.WeakMethod(method)
对绑定方法的弱引用(即在类上定义并在实例上查找的方法)。
>>> import weakref >>> import gc >>> >>> class C: ... def method(self): ... print("WeakMethod Test.") ... >>> c = C() >>> r = weakref.WeakMethod(c.method) >>> r() <bound method C.method of <__main__.C object at 0x000001D643DCEB70>> >>> r()() WeakMethod Test. >>> del c >>> gc.collect() 0 >>> r() >>>