zoukankan      html  css  js  c++  java
  • with open为什么会自动关闭文件流

    操作文件我们通常需要手动关闭文件流,可是通过with open()的时候却可以自动关闭,这是为什么呢?其实这就是上下文管理器。我们来看一个例子

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    """
    你是否想过一个问题,打开文件会抛出异常,通常打开文件后也需要关闭文件流,为什么用 with open()语句可以不用手动关闭文件流呢?
    这就是上下文管理器
    """
    
    class Sample:
    
        def __init__(self):
            # 首先执行这个方法
            print("__init__")
    
        def __enter__(self):
            # 然后会自动调用这个方法,可以理解为获取资源
            print("__enter__")
            return self
    
        def __exit__(self, exc_type, exc_val, exc_tb):
            # 这个函数会自动调用,当跳出with语句的时候,目的是为了释放资源
            print("__exit__")
    
        def toDo(self):
            print("to do something")
    
    """
    __enter__和__exit__构成了上下文管理器
    """
    # 这个用法是不是很像 with open()呢?
    with Sample() as sample:
        print("aaa")

    这个上下文管理器还可以简化一下

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    """
    如何把上下文管理器更加简化一下呢?
    """
    
    import contextlib
    
    @contextlib.contextmanager # 这个装饰器把下面的函数包装成上下文管理器,主要利用了yiele的特性
    def myFun(arg1):
        print("begin", arg1)  # 相当于 __enter__ 里面的代码
        yield {}  # 这里必须有个生成器
        print("finished")  # 相当于 __exit__ 里面的代码
    
    
    with myFun("AAA") as my:
        print("BBB")
    

  • 相关阅读:
    最容易忽略的的前端面试基础题目
    关于浮动宽度不够掉盒子的问题解决方法
    最容易忽略的的前端面试基础题目
    构造字典
    Python数据类型---字典
    Python数据类型---列表
    Python数据类型---字符串
    我要学习Python
    [IT练习册]Python练习项目 思路
    【CTF】后续深入学习内容
  • 原文地址:https://www.cnblogs.com/rexcheny/p/10092152.html
Copyright © 2011-2022 走看看