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

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_()方法的对象都可以用于上下文管理器。

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值