Python上下文管理器
0.上下文管理器
- 上下文管理器是Python中的一种协议,它保证了每次代码执行的一致性
- 一旦进入上下文管理器,就一定会按照规定的步骤退出
- 如果合理的设计了退出上下文管理器的步骤,就能够很好的处理异常。
- 上下文管理器被最多用到的场景是资源清理操作。
- 实现上下文管理器,只要在类定义时,实现__enter__()方法和__exit__()方法即可
- with语句结构就运用到了上下文管理器
1. 异常处理和with语句
异常语句:
try:
f = open("myPython.txt")
print(f.read())
# 捕捉错误
except IOError as e:
print(e)
# 最后都会执行的语句
finally:
f.close();
- 使用with语句替代try-finally 语句,代码更加的简洁清晰。
- 对于需要对资源进行访问的任务,无论在代码运行过程中,是否发生异常,都会执行必要的清理操作,释放资源。
- 在with语句完成时,会自动关闭文件。如果再次读取这个文件,就会出现文件关闭的错误提示信息。
2.上下文管理器访问方法
- 使用with语句访问上下文管理器
- 实现上下文管理器
class A()
def __init__(self, val):
self.a = val
def __enter__(self):
print("class A's __enter__ function.")
# exec_type : 异常的类
# exec_val : 实例
# exev_tb : 跟踪记录
# 如果with语句块正常结束,那么这三个参数全部是None。
def __exit__(self, exec_type, exec_val, exec_tb):
print("class A's __exit__ function.")
1.在with语句块执行前,首先会执行enter()方法
2. 当with语句块执行结束,无论是否出现异常,都会调用__exit__()方法
3.通常将清除、释放资源的操作写在__exit__()方法中
- 模拟实现一个文件类
class File():
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
def __enter__(self):
print("执行__enter__()方法")
self.f = open(self.filename, self.mode)
return self.f
def __exit__(self, *args):
print("执行__exit__()方法")
self.f.close()
# 以读的方式打开当前目录下的mypython文件,并输出文件内容。
with File('myPython.txt', 'r') as f:
print(f.read())
- 在执行with语句块之前,首先执行了__enter()__方法,然后再执行with语句块,最后执行__exit()__方法。
- 采用这种方式读取文件时,即使执行过程中出现了异常,__exit()__方法也会被执行,完成关闭文件的操作。