持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情
0 环境
- 编辑器:pycharm或者vscode
- 系统版本:windows10
- python版本:3.9.6
1 问题
打开1.txt,read读到所有的内容,完成后,要close关闭它。后来有了as后,没加close关闭操作,探索一下,为啥可以省略。如下图:
2 概念
open函数返回值是个文件对象,这个文件对象呢,可以使用上下文管理的对象。比如with ...。
想这个对象支持上下文管理,需要同时实现__enter__和__exit__。
3 使用
那上面的with和Demo怎么用呢,如下代码:
class Demo:
def __enter__(self):
print("Demo enter")
def __exit__(self, *args, **kwargs):
print("Demo exit")
with Demo():
print("1111")
顺序是,先执行__enter__,然后在执行with里的逻辑,最后在执行__exit__。
在with的上下面都加个print打印,说明只针对with。
4 异常处理
如下图:假如在执行with里的逻辑时,出现了异常,它依然会执行__enter__和__exit__。上下文管理的挺安全的。
那么在试试使用更加极端点的exit方式呢,如下图的执行,它两也会照常执行。这样以后我在遇到这种哪怕出现异常的情况,也可以很淡定的在__exit__中结束,比如读写文件,不管是否异常,最后的关闭操作,或者其他的读取了线程,最后关闭的操作。
5 总结
认识到了with的好处,之前只是知道with是这么用的,但没想到还可以这么用,并且它上下文管理很安全,哪怕出现异常,也会执行
__enter__和__exit__。