上下文管理器
上下文管理器的服务对象是with语法
with open(‘file’, ‘r’, encoding=‘utf-8’) as f: # 这个f,是所打开文件的句柄
content = f.read()
print(f)
什么是上下文管理器?
1.上下文管理器是一个Python对象,为操作提供了额外的上下文信息。这种额外的信息,在使用with语句初始化上下文,以及完成with代码块中的所有代码时,采用可调用的形式
上下文管理器是由两个魔术方法来组成的
1.object.enter(str)
a.输入与此对象相关的运行时上下文。如果存在的话,with语句将绑定该方法的返回值到该语句的as子句中指定的目标。
b.这个方法是在with语句开始时执行的
2.object.exit(self, exc_type, exc_val, exc_tb)
a.退出与此对象相关的运行时上下文。如果该上下文退出时没有异常,这三个参数都为None。
b.这个方法是在with语句结束时执行的,可不使用try来记录错误日志。
c.参数解释:
exc_type:异常类型
exc_val:异常值
exc_tb:异常回溯追踪
exc_type=> <class ‘NameError’>
exc_val=> name ‘a’ is not defined
exc_tb=> <traceback object at 0x000000000282F188>
在一个类中,只要实现了上面这两个魔术方法,那么这个类就实现了上下文协议,就是一个上下文管理器类
代码例子
class MyOpen(object):
“”“自定义上下文管理器类”""
def __init__(self, file, method, encoding):
self.file = file
self.method = method
self.encoding = encoding
self.f = open(self.file, self.method, encoding=self.encoding) # 打开文件
def __enter__(self):
print('执行__enter__')
return self.f # 返回打开的文件对象
def __exit__(self, exc_type, exc_val, exc_tb):
self.f.close() # 关闭文件对象
print('执行__exit__')
with MyOpen(‘text.md’, ‘r’, ‘utf-8’) as f: # f的值就是__enter__的返回值
print(‘执行with中的代码’)
text = f.read()
print(text)
执行顺序图解