with 语句浅析

with 语句是读写文件的优雅写法

with open('xxx.txt','w') as f:
    f.writelines(['I','love','the','world'])

由于文件对象会占用操作系统资源,同时操作系统同一时间打开的文件数量有限,所以在读写的过程中要确保,无论是否出现异常,都需要最后调用close()方法,而with语句会调用close()

其中涉及到的概念: 上下文管理器

定义

上下文管理器是这样一个对象:它定义程序运行时需要建立的上下文,处理程序的进入和退出,实现了上下文管理协议,即在对象中定义了 __enter__() 和 __exit__() 方法。

__enter__():进入运行时的上下文,返回运行时上下文相关的对象,with 语句中会将这个返回值绑定到目标对象。 

__exit__(exception_type, exception_value, traceback):退出运行时的上下文,定义在块执行(或终止)之后上下文管理器应该做什么。它可以处理异常、清理现场或者处理 with 块中语句执行完成之后需要处理的动作。

自定义上下文管理器

class Context(object):
    def do_something(self):
        print('do something')

    def __enter__(self):
        print('run __enter__')
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('run __exit__')
        return True

with Context() as ctx:
    ctx.do_something()
原文地址:https://www.cnblogs.com/songxiaohua/p/9784084.html