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)

    借用别人的成果用一下:

  • 相关阅读:
    点图换说明文字
    酷酷的图片预览带加载效果
    阿里巴巴右侧6滑块VS雅虎右侧6滑块VS自定义6滑块
    绝对经典的滑轮新闻显示(javascript+css)
    一个城市、日历选择功能
    比较两个日期大小
    我对委托/事件的理解
    今天写信息采集小程序时实现程序中同时只允许5个线程运行
    Web页面接受客户端POST数据,并且返回数据
    项目中用到的一个树控件[经过修改]
  • 原文地址:https://www.cnblogs.com/blog-zg/p/12370894.html
Copyright © 2011-2022 走看看