zoukankan      html  css  js  c++  java
  • 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)

    借用别人的成果用一下:

  • 相关阅读:
    【设计模式】备忘录
    统计ip的发送频率和该ip发送的有效消息(去除相似消息)的数目
    Android之消息推送聊天实现
    Dictionary通过下标获取key和value
    SGU 271 水题。。。。
    二叉树递归和非递归遍历
    C#与SSL
    正则表达式总结
    SQL Server User Accounts
    嵌入式领域中各种文件系统的比较
  • 原文地址:https://www.cnblogs.com/blog-zg/p/12370894.html
Copyright © 2011-2022 走看看