Python Study(02)之 Context Manager
上下文管理器(context manager)是Python2.5开始支持的一种语法,用于规定某个对象的使用范围。一旦对象进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存)。它的语法形式是with…as…
关闭文件
我们会进行这样的操作:打开文件,读写,关闭文件。程序员经常会忘记关闭文件。上下文管理器可以在不需要文件的时候,自动关闭文件。
f = open("new.txt", "w")
print(f.closed) # whether the file is open
f.write("Hello World!")
f.close() #如果此处不关闭,那么该文件一直被锁定
print(f.closed)
使用Context Manger
with open("new.txt", "w") as f:
print(f.closed)
f.write("Hello World!")
# 当离开此处时候,必然就自动关闭。
print(f.closed)
两段程序实际上执行的是相同的操作。我们的第二段程序就使用了上下文管理器 (with…as…)。上下文管理器有隶属于它的程序块。当隶属的程序块执行结束的时候(也就是不再缩进),上下文管理器自动关闭了文件 (我们通过f.closed来查询文件是否关闭)。我们相当于使用缩进规定了文件对象f的使用范围。
上下文管理器本质
我们使用上下文管理器的语法时,我们实际上是通过with Object as obj。即要求Python在进入with…as…程序块之前调用对象obj的__enter__()方法,在结束程序块的时候调用obj的__exit__()方法。
对于文件对象f来说,文件对象f是内置对象,所以f自动带有这两个特殊方法,不需要自定义。它定义了__enter__()和__exit__()方法(可以通过dir(f)看到)。在f的__exit__()方法中,有self.close()语句。所以在使用上下文管理器时,我们就不用明文关闭f文件了。
自定义上下文管理器
任何定义了_enter_()和_exit_()方法的对象都可以用于上下文管理器。 当然文件对象f是内置对象,所以f自动带有这两个特殊方法,不需要自定义。
class VOW(object):
def __init__(self, text):
self.text = text
def __enter__(self):
self.text = "I say: " + self.text # add prefix
return self # note: return an object
def __exit__(self,exc_type,exc_value,traceback):
self.text = self.text + "!" # add suffix
with VOW("I'm fine") as myvow:
print(myvow.text)
print(myvow.text)
在进入上下文和离开上下文时,对象的text属性发生了改变(最初的text属性是”I’m fine”)。
enter()返回一个对象。上下文管理器会使用这一对象作为as所指的变量,也就是myvow。在enter()中,我们为myvow.text增加了前缀 (“I say: “)。在exit()中,我们为myvow.text增加了后缀(“!”)。
注意: exit()中有四个参数。当程序块中出现异常(exception),exit()的参数中exc_type, exc_value, traceback用于描述异常。我们可以根据这三个参数进行相应的处理。如果正常运行结束,这三个参数都是None。在我们的程序中,我们并没有用到这一特性。
Python Study(02)之 Context Manager的更多相关文章
- Python——with语句、context manager类型和contextlib库
目录 一.with语句 二.上下文管理器 三.contextlib模块 基本概念 上下文管理协议(Context Management Protocol) 包含方法 __enter__() 和 __e ...
- Python上下文管理器(context manager)
上下文管理器(context manager)是Python2.5开始支持的一种语法,用于规定某个对象的使用范围.一旦进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存).它的语 ...
- Python之 context manager
在context manager中,必须要介绍两个概念: with as... , 和 enter , exit. 下文将先介绍with语句,然后介绍 __enter__和exit, 最后介绍cont ...
- Python深入02 上下文管理器
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 上下文管理器(context manager)是Python2.5开始支持的一种语 ...
- pythonic context manager知多少
Context Managers 是我最喜欢的 python feature 之一,在恰当的时机使用 context manager 使代码更加简洁.清晰,更加安全,复用性更好,更加 pythonic ...
- Python学习02 列表 List
Python学习02 列表 List Python列表 List Python中的列表(List)用逗号分隔,方括号包围(comma-separated values (items) between ...
- Python网络02 Python服务器进化
原文:Python网络02 Python服务器进化 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! **注意,在Python 3. ...
- Android的Context Manager(服务管理器)源码剖析-android学习之旅(99)
Context Manager介绍 Context Manager对应的进程是servicemanager进程,它先于Service Server和服务客户端运行,进入接收IPC数据的待机状态,处理来 ...
- python进阶02 特殊方法与特殊属性
python进阶02 特殊方法与特殊属性 一.初始化.析构 1.初始化 # python中有很多双下划线开头且以下划线结尾的固定方法,它们会在特定的时机被触发执行,这便是特殊方法 # 在实例化的时候就 ...
随机推荐
- Tomcat容器 web.xml具体解释
<init-param> <param-name>debug</param-name> <param-value>0</param-value&g ...
- Centos7操作系统部署指南
一.硬件环境: Dell R620 二.软件环境: Centos6.4 X86_64 +KVM Windows7+vnc 三.安装说明 操作系统更新之迅速,让作为新手的系统运维人员有点措手不及,相对于 ...
- 安装eclipse maven插件m2eclipse No repository found containing
m2eclipse插件是Eclipse的一款Maven插件. 安装m2eclipse插件的步骤例如以下: 启动Eclipse,在菜单条中选择Help,然后选择Install New Software- ...
- 修改linux内核开机logo并居中全屏显示【转】
本文转载自:http://blog.csdn.net/xuezhimeng2010/article/details/49299781 1.准备图片 使用ubuntu自带的绘图软件GIMP是最为快捷的 ...
- OCC 矩阵变换
在OpenCADCADE中, 通过gp_Trsf类来进行矩阵变换操作, 采用矩阵在左的方式: 新点 = 变换矩阵 * 点 基本原理如下: //! Defines a non-persistent tr ...
- BZOJ 3060 Kruskal
思路: 把from&to都>k的直接加边 剩下的如果是一棵树就加. 否则ans++ (我的代码写的是反着的 不过意思都一样) //By SiriusRen #include <cs ...
- js隐藏与显示回到顶部按钮
window.onscroll = function () { if (document.documentElement.scrollTop + document.body.scrollTop > ...
- jQuery操作DOM知识总结
jquery操作DOM(节点) 1.创建元素 //$(htmlStr) //htmlStr:html格式的字符串 $("<span>这是一个span元素</span> ...
- 12) 十分钟学会android--APP通信传递消息之简单数据传输
程序间可以互相通信是Android程序中最棒的功能之一.当一个功能已存在于其他app中,且并不是本程序的核心功能时,完全没有必要重新对其进行编写. 本章节会讲述一些通在不同程序之间通过使用Intent ...
- Bootstrap3 学习笔记
图片新窗口打开浏览