Python学习笔记(五)-- 上下文管理器(Context Manager)

2017-01-13 10:56:04来源:csdn作者:eternity1118_人点击

第七城市

定义
如何使用
如何创建

1.定义

写代码时,我们希望把一些操作放到一个代码块中,这样在代码块中执行时就可以保持在某种运行状态,而当离开该代码块时就执行另一个操作,结束当前状态;所以,简单来说,上下文管理器的目的就是规定对象的使用范围,如果超出范围就采取“处理”。 这一功能是在Python2.5之后引进的,它的优势在于可以使得你的代码更具可读性,且不容易出错。

2.如何使用

首先我们来看一段未使用上下文管理器的代码,看看它在运行过程中会出现什么问题?

#when without using context manager
f = open("hl.txt", "w")
print(f.closed)#运行到这里,会打印出False,因为没有关闭
f.write("Hello,context manager!")
f.close()
print(f.closed)#这里才会打印出True,表示文件关闭

表面上看似这段代码也并没什么大的问题,但是仔细想想,你会发现,如果这段代码根本执行不到f.close()这一句呢,是不是就出现问题了,假设我们在写入的过程中,磁盘满了,代码就会在写入的那一句出现异常,这样就永远执行不到f.close()这一句,文件就永远不会被关闭,可能你会说我可以用try…finally语句啊,不就解决这个问题了么,但是同样会有问题在里面。 问题就在于,当我们执行的不是简单的写入操作,而是其他更复杂的操作,如拷贝,同时读和写,这时你会看到try…finally语句根本无法保证代码的美感,简直太糟糕。。所以,上下文管理器就派上用场了,它可以保证不论何时,你的代码都是美观的且安全的。 下面,让我们来看一下使用了上下文管理器的情况,会是什么样子的?

#when using context manager
with open("hl.txt","w") as f:
print(f.closed)#False
f.write("Hello,context manager!")
print(f.closed)#True 无需执行f.close()

上面代码中,可以看到一个代码块:with…as… 其中,with关键词总是伴随着上下文管理器出现,as关键词将open(“hl.txt”,”w”)赋给了新的对象f,使得在该代码块中可以对f执行任意操作,代码相当简洁。

3.如何创建

想要作为上下文管理器,还需要做一些工作,即需要实现两个方法:_enter_()和_exit_(); _enter_():负责进入代码块的准备工作,进入前被调用; _exit_():负责离开代码块的善后工作,离开后被调用;

class MyCM(object):
def __init__(self,text):
self.text = text
def __enter__(self):
self.text = "Enter:" + self.text
return self
def __exit__(self,exc_type,exc_value,traceback):
self.text = self.text + " exit now..."with MyCM("Context Manager") as mycm:
print(mycm.text)
print(mycm.text)

打印结果: Enter:Context Manager Enter:Context Manager exit now… 任何定义了_enter_()和_exit_()方法的对象都可以用于上下文管理器。


第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台