with open为什么会自动关闭文件流

本文深入探讨了Python中上下文管理器的原理,解释了如何使用__enter__和__exit__方法自动管理资源,如文件流的打开和关闭。并通过实例展示了如何自定义上下文管理器,以及使用contextlib模块进一步简化上下文管理器的创建。

操作文件我们通常需要手动关闭文件流,可是通过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")

转载于:https://www.cnblogs.com/rexcheny/p/10092152.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值