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)

借用别人的成果用一下:

原文地址:https://www.cnblogs.com/blog-zg/p/12370894.html