Python开发【模块】:Weakref
2018-03-09 13:49
281 查看
Weak references
前言:weakref模块允许python开发者创建弱引用对象。
再接下来中,术语referent代表被弱引用所引用的对象。
一个弱引用对于对象是不能够保持对象存活的:当仅剩下referent的引用都是弱引用时,垃圾回收机制是可以自由销毁referent然后重新使用内存的。然而,直到对象被真正销毁之前,弱引用可能返回一个对象,即使它没有强引用。
弱引用的主要用处是实现缓存和映射保持大型对象,期望大型对象不能仅仅因为出现在缓存或映射中而保持存活。
举个栗子,如果你有一些大型二进制image对象,你可能希望用name与每个image关联起来。如果你用python中的字典去映射names对images,或者images对names。image对象将仍然存活仅仅因为它作为key值或value值存放在字典中。 weakref中的WeakKeyDictionary和WeakValueDictionary是另一种选择,使用弱引用会构造映射,映射不会仅因为对象出现在映射中而保持存活。再举个栗子,一个image对象作为value存放于WeakValueDictionary中,当image对象最后的引用时弱映射中的弱引用时,垃圾回收机制会回收对象,在弱映射中对应的条目也会被删除。
WeakKeyDictionary和WeakValueDictionary使用弱引用实现,设置回调方法,当弱字典的key或value被垃圾回收机制回收时会通知弱字典。WeakSet实现了set接口,但是对它的元素却保持了弱引用,就像WeakKeyDictionary一样。
finalize提供了一个直接的方式注册清理函数,当对象被垃圾回收是调用,这比在原始的弱引用上设置回调函数更简单,因为该模块自动确保终结器在对象被收集之前仍然存活。大多是程序发现使用弱类型或finalize是所需要的,低级别机器由weakref模块公开,以获得高级应用的好处。但是并不是所有的对象都可以被弱引用的;可以引用的包括类实例、Python中的方法(不在C中)、实例方法、集合、frozensets、一些文件对象、生成器、类型对象、sockets、arrays、dequeues、正则、代码对象。
更改再version 3.2: 添加支持thread.lock, threading.Lock, and code objects。
一些内置类型,如list和dict不直接支持弱引用,但是可以通过子类添加支持。
class Dict(dict): pass obj = Dict(red=1, green=2, blue=3) # this object is weak referenceable
其他内置类型,如tuple和int,即使在子类化时也不支持弱引用(这是一个实现细节,可能在不同的Python实现中是不同的)。扩展类型可以很容易地支持弱引用。
使用:
1、
weakref.
ref(object[, callback])
相关文章推荐
- python weakref模块
- Python笔记:weakref模块
- python开发_xml.etree.ElementTree_XML文件操作_该模块在操作XML数据是存在安全隐患_慎用
- 【Python开发】Python PIL ImageDraw 和ImageFont模块学习
- Python运维自动化开发之Fabric模块
- python开发_xml.etree.ElementTree_XML文件操作_该模块在操作XML数据是存在安全隐患_慎用
- Ubuntu15.10下如何使用EasyGui模块开发Python GUI
- python 开发模块之Requests-multipart/form-data
- 教你分分钟开发一个属于自己的python模块(一)——能够直接在浏览器打印的方法
- [Python标准库]weakref——对象的非永久引用
- python开发_常用的python模块及安装方法
- python开发_常用的python模块及安装方法
- 教你分分钟开发一个属于自己的python模块(一)——能够直接在浏览器打印的方法
- python开发技术详解---第五章:模块与函数
- Python开发【第五篇】:模块
- 零基础自学用Python 3开发网络爬虫(五): 使用第三方模块快速抓取与解析
- Ubuntu15.10下如何使用EasyGui模块开发Python GUI
- 如何在windows下的Python开发工具IDLE里安装其他模块?
- Python开发【模块】:CSV文件 数据可视化
- 如何在windows下的Python开发工具IDLE里安装其他模块?