python的的with上下文其实可以自己实现,只要该对象实现了__enter__和__exit__方法,就实现了一个with上下文,可以用with来处理该对象,如下:
class MyResource:
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, tb):
if tb:
print('proccess exception')
else:
print('no exception')
print('close resource connection')
def query(self):
print('query data')
with MyResource() as resource:
resource.query()
注意:
1、任何实现了__enter__和__exit__魔法方法的对象都能用with处理
2、with实例化对象后用as赋给一个变量,变量为__enter__所返回的值,上面代码中__enter__返回的是实例对象。
3、调用的顺序是__enter__,然后with里的逻辑,最后是__exit__方法。
4、__exit__ 方法包含4个参数,分别是(self, exc_type, exc_value, tb),第一个是实例对象,后面三个分别为异常类型、异常值和异常堆栈信息。这里主要是为了捕获异常,只要是逻辑处理中危险异常,都会在这里捕获,并退出。
5、__exit__ 方法是有返回的,如果return值是Ture的话,就代表捕获了异常,不会抛出;如果返回值为空或者返回False,就代表异常会继续抛出。
版权属于:Jolly
本文链接:https://totoro.site/index.php/archives/34/
关于转载:原创文章,禁止转载