02-python中with的用法
摘自:https://www.toutiao.com/i6797744580356735499/
with 是一种上下文管理协议,目的在于从流程图中把 try,except 和 finally 关键字和资源分配释放相关代码统统去掉,
简化 try ... except ... finally 的处理流程。
with 通过 _enter_ 方法初始化,然后在 _exit_ 中做善后以及处理异常,所以用 with 处理的对象必须有 _enter_() 和 _exit_() 这两个方法,
其中__enter__()方法在语句体(with语句包裹起来的代码块)执行之前进入运行,exit()方法在语句体执行完毕退出后运行。
with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、
线程中锁的自动获取和释放等。
示例:
with open("readme.txt", "r") as fp:
print(fp.read())
with语句的工作原理:
紧跟with后面的语句会被求值,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as关键字后面的变量,当with后面的代码块全部被执行完之后,
将调用前面返回对象的__exit__()方法。with语句最关键的地方在于被求值对象必须有__enter__()和__exit__()这两个方法,
那我们就可以通过自己实现这两方法来自定义with语句处理异常。
我们按照这个重写一段:
class opened(object):
def _init_(self, filename):
self.handle=open(filename)
print("Resource: %s" %filename)
def _enter_(self):
print("[enter %s]: Allocate resource." %self.handle)
return self.handle # 可以返回不同的对象
def _exit_(self, exc_type, exc_value, exc_trackback):
print("[Exit %s]: Free resource." %self.handle)
if exc_trackback is None:
print("[Exit %s]: Exited without exception." %self.handle)
self.handle.close()
else:
print("[Exit %s]: Exited eith exception raised." %self.handle)
return False
with opened(r"readme.txt", "r") as fp:
for line in fp.readlines():
print(line)
借用别人的成果用一下: