with的作用
使用with后不管with中的代码出现什么错误,都会进行对当前对象进行清理工作。 例如file的file.close()方法,无论with中出现任何错误,都会执行file.close()方法。
with open() as f:
其次with只有特定场合下才能使用。这个特定场合只的是那些支持了上下文管理器的对象。
什么是上下文管理器
这个管理器就是在对象内实现了两个方法其中为__enter__() 和__exit__()
方法__enter__()方法会在with的代码块执行之前执行,exit()会在代码块执行结束后执行。
方法__exit__()内会自带当前对象的清理方法。
重点:
with方法适用于需要分配和清理资源的情况,比如数据库连接。with方法的实现必须定义 enter()和__exit__()函数。
类和异常的结合
#自己定义一个with方法
class Testwith():
def __enter__(self):
print("run")
def __exit__(self,exc_type,exc_val,exc_tb):
print("exit")
#类的初始化和类的退出
with Testwith():
print("Test is runing")
输出的结果:
run
Test is runing
exit
以上的代码中,是没有异常报错的情况,而下面的是有异常报错的情况下,如何输出:
class Testwith():
def __enter__(self):
print("run")
def __exit__(self,exc_type,exc_val,exc_tb):
if exc_tb is None:
print('正常结束')
else:
print('has error %s' %exc_tb)
#类的初始化和类的退出
with Testwith():
print("Test is runing")
raise NameError('testNameError')
输出的结果:
run
抛出异常的信息
Test is runing
这就是类和with的结合