操作文件我们通常需要手动关闭文件流,可是通过with open()的时候却可以自动关闭,这是为什么呢?其实这就是上下文管理器。我们来看一个例子
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
你是否想过一个问题,打开文件会抛出异常,通常打开文件后也需要关闭文件流,为什么用 with open()语句可以不用手动关闭文件流呢?
这就是上下文管理器
"""
class Sample:
def __init__(self):
# 首先执行这个方法
print("__init__")
def __enter__(self):
# 然后会自动调用这个方法,可以理解为获取资源
print("__enter__")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
# 这个函数会自动调用,当跳出with语句的时候,目的是为了释放资源
print("__exit__")
def toDo(self):
print("to do something")
"""
__enter__和__exit__构成了上下文管理器
"""
# 这个用法是不是很像 with open()呢?
with Sample() as sample:
print("aaa")
这个上下文管理器还可以简化一下
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
如何把上下文管理器更加简化一下呢?
"""
import contextlib
@contextlib.contextmanager # 这个装饰器把下面的函数包装成上下文管理器,主要利用了yiele的特性
def myFun(arg1):
print("begin", arg1) # 相当于 __enter__ 里面的代码
yield {} # 这里必须有个生成器
print("finished") # 相当于 __exit__ 里面的代码
with myFun("AAA") as my:
print("BBB")