弱引用的用途:在底层C++对象被上层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
>>> ref
Traceback (most recent call last):
File "<stdin>", line 1, in ?
转载于:https://www.cnblogs.com/bjdxy/archive/2013/01/16/2862709.html
弱引用的用途:在底层C++对象被上层python脚本对象使用时(转)相关推荐
- iOS之深入解析内存管理散列表SideTables和弱引用表weak_table的底层原理
一.SideTables 和 weak_table 的关系 在 runtime 中,有四个数据结构非常重要,分别是 SideTables,SideTable,weak_table_t 和 weak_e ...
- python中实例和对象的区别,python类对象和实例对象有什么区别吗
python类对象和实例对象有什么区别吗 发布时间:2020-07-20 14:10:37 来源:亿速云 阅读:119 作者:清晨 这篇文章主要介绍python类对象和实例对象有什么区别吗,文中介绍的 ...
- java 虚引用 作用_Java的强引用、弱引用、软引用和虚引用,以及用途
Java种除了基本数据类型,其它数据类型都是引用的数据类型.而应用数据类型根据生命周期的长短又分为:强引用.弱引用.软引用和需引用(幻象引用),我们平时基本上只用到强引用类型,而其他的引用类型我们也就 ...
- iOS 中集合如何弱引用对象
1. 使用 NSValue NSValue 可以弱引用保存一个对象,我们可以使用这种方法间接的引用. NSValue *value = [NSValue valueWithNonretainedObj ...
- 理解Java中的弱引用(Weak Reference)
理解Java中的弱引用(Weak Reference) 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限, ...
- 弱引用是什么,和其他引用有啥区别?
前言 最近看 WeakHashMap 代码时,发现了一个名词叫 弱引用 ,然而我居然没听说过,这可不能忍所以打算研究下这是啥玩意儿. 其实就是多看几篇博客,然会汇总下而已... 四种引用的定义 Jav ...
- Java 理论与实践: 用弱引用堵住内存泄漏---转载
要让垃圾收集(GC)回收程序不再使用的对象,对象的逻辑 生命周期(应用程序使用它的时间)和对该对象拥有的引用的实际 生命周期必须是相同的.在大多数时候,好的软件工程技术保证这是自动实现的,不用我们对对 ...
- python 弱引用
文章目录 创建弱引用 创建代理对象 循环引用 缓存对象 (WeakValueDictionary) 垃圾回收 和许多其它的高级语言一样,Python使用了垃圾回收器来自动销毁那些不再使用的对象.每个对 ...
- 一文讲透java弱引用以及使用场景
文章目录 概念 深入原理 应用案例解析 概念 大部分情况下我们看到是强引用,比如下面这一行: String str1 = new String("abc"); 变量str1被用来存 ...
最新文章
- django设置cookie和session
- OpenWRT 随记
- Android可输入的下拉框,android 可编辑的下拉框 Demo
- java: cannot execute binary file错误
- 分布式事物(2PC,3PC,CAP,柔性与刚性事物,LCN)
- Google X 新项目,用计算机视觉养鱼?
- C#的String.Split方法
- python----运行机制
- 阿里云云计算 40 CDN的概念
- 一文读懂TOGAF企业架构
- 关于VC6和VC9的区别
- 哈工大离散数学期末试题2021回忆版
- 信息学奥赛一本通习题答案(一)
- C++ 读取TXT文件
- 未来计算机体系结构探索,未来计算机体系结构将是什么样的发展趋势
- JAVA怎么打开pkg_PKG文件在电脑上怎么打开!(普通PC)
- 问题:_ZN6caffe28TypeMeta21_typeMetaDataInstanceIN3c107complexINS2_4HalfEEEEEPKNS_
- python编程怎么画三角形的外接圆_用MATLAB画三角形外接圆
- 计算机网络实验报告 静态路由的配置
- 基于C++的OpenCV(八)图像处理