zoukankan      html  css  js  c++  java
  • 关于with和上下文管理器的执行过程和原理

    
    
    with的作用

        说通俗易懂一点就是当with语句执行完之后,with会自动帮我们关闭或断开对象所占用的系统资源.实现了上下文管理协议的对象都可以被with作用.下面是最简单的一个关于with的使用

    def fun():
        with open("output.txt", "w") as f:
            f.write("Python之禅")

    open 方法的返回值赋值给变量 f,当离开 with 代码块的时候,系统会自动调用 f.close() 方法.

    下面介绍什么是上下文管理器.

        任何实现了 __enter__() 和 __exit__() 方法的对象都可称之为上下文管理器,其中__enter__必须返回一个可以操作的对象,__exit__()处理一些清除工作.

    请看下面例子,模拟了一个使用open()打开文件的上下文管理器.

    class File():
    
        def __init__(self, filename, mode):
            self.filename = filename
            self.mode = mode
    
        def __enter__(self):
            print("entering")
            self.f = open(self.filename, self.mode)
            return self.f
    
        def __exit__(self, *args):
            print("will exit")
            self.f.close()

    File这个类实现了上下文管理器,就可以使用with了

    with File('out.txt', 'w') as f:
        print("writing")
        f.write('hello, python')

    with语句的代码块执行过程:
    1)计算表达式的值,返回一个上下文管理器的对象
    2)加载上下文管理器对象的__exit__()方法以备使用
    3)调用上下文的__enter__方法
    4)如果with与语句中设置了目标对象,则将__enter__()的返回值赋值给目标对象
    5)执行with中的代码块
    6)如果步骤5代码正常结束,调用上下文的__exit__()方法,其返回值将被忽略
    7)如果步骤5执行过程中抛出异常,调用上下文的__exit__()方法,
    并将异常类型.值即traceback信息作为参数传递给__exit__()方法.
    如果__exit__的值为false,则异常会被重新抛出,如果为True,
    异常被挂起,程序继续执行


  • 相关阅读:
    Selenium开发环境搭建
    如何抓取移动端崩溃日志?
    html+ashx + NPOI 实现导出Excel文件并且预览和下载
    oss 文件上传:Web端上传介绍
    事务控制和锁定语句
    索引的设计和使用
    最近几年读过的书籍
    053.NET5_EFCoreMigration
    052.NET5_EFCoreDbFirst
    051.NET5_中间件的多种引用方式
  • 原文地址:https://www.cnblogs.com/fanlei5458/p/9235487.html
Copyright © 2011-2022 走看看