擅长:python、mysql、java
<p>这是因为文件对象也是上下文管理器。基本上,一个类需要定义一个<code>__enter__</code>和一个<code>__exit__</code>函数,这两个函数将分别在<code>with</code>块的开始和结尾被调用。在</p>
<p>下面是一个简单的上下文管理器示例,它在<code>with</code>块的开头打印“on enter”,在末尾打印“on exit”:</p>
<pre><code>class contextmanager:
def __enter__(self):
print('on enter')
def __exit__(self, type, value, traceback):
print('on exit')
</code></pre>
<p>还有一个使用它的例子:</p>
^{pr2}$
<p>现在让我们尝试一下,在with语句中引发一个异常:</p>
<pre><code>>>> with contextmanager():
... raise Exception()
...
on enter
on exit
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
Exception
</code></pre>
<p>您可以看到<code>__exit__</code>函数中的代码在<code>with</code>语句的末尾被调用,无论它是正常执行还是引发异常。对于文件对象,它们使用此函数关闭文件句柄并进行清理。在</p>