上下文管理器是什么
python 里,实现了__enter__ 和 __exit__ 方法的 class。
最常见的上下文管理器,就是利用操作文件时,使用的 open() 函数。
一个上下文管理器,利用with 方法来使用
使用好处
使用场景:在使用对象时,需要在结束任务后,执行一些关闭操作,例如对一个文件操作后,需要将文件关闭,或者在获取一个数据库连接后,要进行关闭操作。
有一个特性是,在 with 代码块中,即使发生了错误,也会执行 __exit__ 方法,这样就能保证关闭操作一定会执行。
自己实现一个上下文管理器
class Context:
def __init__(self) -> None:
self.test = 1
def __enter__(self):
print('__enter__')
# 这块 return 的对象,可以在 with 之后使用
return self
def __exit__(self, exc_type, exc_val, exc_tb):
'''
此方法一定会执行,即使代码出现了错误。
exc_type, exc_val, exc_tb 是错误类型
分别代表异常类型,异常值和追溯信息
如果此方法返回了 True,表示后续代码正常执行,否则就会在执行完 __exit__ 方法后,返回错误
'''
print('__exit__')
print(exc_type, exc_val, exc_tb)
return True
with Context() as c:
print('执行中')
# c 就是 __enter__ 方法中返回的对象
print(c.test)
# 制造一个错误
1 / 0
返回信息是
__enter__
执行中
1
__exit__
<class 'ZeroDivisionError'> division by zero <traceback object at 0x000002648796D140>
如果将 __exit__ 中的return注释掉的话,会将错误发送出来。
__enter__
执行中
1
__exit__
<class 'ZeroDivisionError'> division by zero <traceback object at 0x000001FA905E0FC0>
Traceback (most recent call last):
File ".\ppp.py", line 54, in <module>
1 / 0
ZeroDivisionError: division by zero