Weak references

前言:

  • weakref模块允许python开发者创建弱引用对象。
  • 再接下来中,术语referent代表被弱引用所引用的对象。
  • 一个弱引用对于对象是不能够保持对象存活的:当仅剩下referent的引用都是弱引用时,垃圾回收机制是可以自由销毁referent然后重新使用内存的。然而,直到对象被真正销毁之前,弱引用可能返回一个对象,即使它没有强引用。
  • 弱引用的主要用处是实现缓存和映射保持大型对象,期望大型对象不能仅仅因为出现在缓存或映射中而保持存活。
  • 举个栗子,如果你有一些大型二进制image对象,你可能希望用name与每个image关联起来。如果你用python中的字典去映射names对images,或者images对names。image对象将仍然存活仅仅因为它作为key值或value值存放在字典中。 weakref中的WeakKeyDictionaryWeakValueDictionary是另一种选择,使用弱引用会构造映射,映射不会仅因为对象出现在映射中而保持存活。再举个栗子,一个image对象作为value存放于WeakValueDictionary中,当image对象最后的引用时弱映射中的弱引用时,垃圾回收机制会回收对象,在弱映射中对应的条目也会被删除。
  • WeakKeyDictionaryWeakValueDictionary使用弱引用实现,设置回调方法,当弱字典的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的更多相关文章

  1. python开发模块基础:re正则

    一,re模块的用法 #findall #直接返回一个列表 #正常的正则表达式 #但是只会把分组里的显示出来#search #返回一个对象 .group()#match #返回一个对象 .group() ...

  2. python开发模块基础:异常处理&hashlib&logging&configparser

    一,异常处理 # 异常处理代码 try: f = open('file', 'w') except ValueError: print('请输入一个数字') except Exception as e ...

  3. python开发模块基础:os&sys

    一,os模块 os模块是与操作系统交互的一个接口 #!/usr/bin/env python #_*_coding:utf-8_*_ ''' os.walk() 显示目录下所有文件和子目录以元祖的形式 ...

  4. python开发模块基础:序列化模块json,pickle,shelve

    一,为什么要序列化 # 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化'''比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?现在我们能想到的方法就是存在文 ...

  5. python开发模块基础:time&random

    一,time模块 和时间有关系的我们就要用到时间模块.在使用模块之前,应该首先导入这个模块 常用方法1.(线程)推迟指定的时间运行.单位为秒. time.sleep(1) #括号内为整数 2.获取当前 ...

  6. python开发模块基础:collections模块&paramiko模块

    一,collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdic ...

  7. python开发模块基础:正则表达式

    一,正则表达式 1.字符组:[0-9][a-z][A-Z] 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示字符分为很多类,比如数字.字母.标点等等.假如你现在要求一个位置&q ...

  8. Python开发——目录

    Python基础 Python开发——解释器安装 Python开发——基础 Python开发——变量 Python开发——[选择]语句 Python开发——[循环]语句 Python开发——数据类型[ ...

  9. Python开发【第六篇】:模块

    模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...

  10. python辅助开发模块(非官方)如pil,mysqldb,openpyxl,xlrd,xlwd

    官方文档 只是支持win32, 不支持win64 所以很麻烦 民间高人,集中做了一堆辅助库,下载后,用python安装目录下的scripts中,pip和easy_install就可以安装了 pytho ...

随机推荐

  1. Github上star数超1000的Android列表控件

    Android开发中,列表估计是最最常使用到的控件之一了.列表相关的交互如下拉刷新,上拉更多,滑动菜单,拖动排序,滑动菜单,sticky header分组,FAB等等都是十分常见的体验.Github中 ...

  2. Java网络编程之查找Internet地址

    一.概述 连接到Internet上计算机都有一个称为Internet地址或IP地址的唯一的数来标识.由于IP很难记住,人们设计了域名系统(DNS),DNS可以将人们可以记忆的主机名与计算机可以记忆的I ...

  3. Android自定义字体

    1.在assets中创建文件夹fonts,放入字体文件.ttf 2.使用实例: TextView tv= (TextView)findViewById(R.id.tv); Typeface tf =  ...

  4. 《转》Python学习(19)-python函数(二)-关于lambda

    转自http://www.cnblogs.com/BeginMan/p/3178103.html 一.lambda函数 1.lambda函数基础: lambda函数也叫匿名函数,即,函数没有具体的名称 ...

  5. Ubuntu14.04安装CMake3.0.2

    http://blog.csdn.net/wz3118103/article/details/39826397 .去网址下载http://www.cmake.org/download/ Platfor ...

  6. c++ malloc与free

    今天看STL内存配置器的时候,第一级配置器就是直接用malloc.free来管理内存. 而free和malloc都只需要传入或传出一个指针就能分配和释放内存了. 编译器是如何知道,这个指针指向的空间的 ...

  7. c++11 delete禁用函数

    c++11添加了delete关键字. 不想用那个函数,在那个函数后面加 = delete就可以了: 比如: 在函数重载中,可用 delete 来滤掉一些函数的形参类型,如下: bool IsLucky ...

  8. Bat脚本实现监控进程功能

    脚本不间断监控notepad.exe进程是否执行,若停止,则自动重启该进程,程序如下: @echo off set _task = notepad.exe set _svr = c:\windows\ ...

  9. Mac下一款门罗币挖矿木马的简要分析

    背景 最近在应急中发现了一款Mac上的挖矿木马,目标是挖门罗币,经过走访,受害用户都有从苹果电脑上安装第三方dmg的经历(其中可以确定一款LOL Mac私服安装app会导致该木马),怀疑在网上很多第三 ...

  10. Dockerfile ,ADD详细解读

    一.ADD指令 ADD指令的功能是将主机构建环境(上下文)目录中的文件和目录.以及一个URL标记的文件 拷贝到镜像中. 其格式是: ADD  源路径  目标路径 如: #test FROM ubunt ...