一个上下文管理器的类,最起码要定义__enter__
和__exit__
方法。
让我们来构造我们自己的文件开启的上下文管理器,并学习下基础知识。
class File(object):
def __init__(self, file_name, method):
self.file_obj = open(file_name, method)
def __enter__(self):
return self.file_obj
def __exit__(self, type, value, traceback):
self.file_obj.close()
通过定义__enter__
和__exit__
方法,我们可以在with
语句里使用它。我们来试试:
with File('demo.txt', 'w') as opened_file:
opened_file.write('Hola!')
我们的__exit__
函数接受三个参数。这些参数对于每个上下文管理器类中的__exit__
方法都是必须的。我们来谈谈在底层都发生了什么。
with
语句先暂存了File
类的__exit__
方法- 然后它调用
File
类的__enter__
方法 __enter__
方法打开文件并返回给with
语句- 打开的文件句柄被传递给
opened_file
参数 - 我们使用
.write()
来写文件 with
语句调用之前暂存的__exit__
方法__exit__
方法关闭了文件