python使用with操作上下文管理器

python 提供了with语法用于简化资源操作的后续清除操作,实现原理建立在上下文管理器协议(实现__enter__和__exit__)之上。

上下文管理器:上下文管理器的本质就是能够支持with操作。任何实现了__enter__()和__exit__() 方法的对象都可以成为上下文管理器。

常见的文件对象就是实现了上下文管理器。

实现上下文管理器, 写一个自己的文件类

class MyFile(object):
    """支持上下文管理器的类"""
    def __init__(self, file_name, file_mode):
        """构造实例对象"""
        self.name = file_name
        self.mode = file_mode

    def __enter__(self):
        """上文 提供资源"""
        print("进入上文 获取资源")
        self.temp_file = open(self.name, self.mode)
        return self.temp_file

    def __exit__(self, exc_type, exc_val, exc_tb):
        """下文 提供资源关闭的方法"""
        print("进入下文 关闭资源")
        self.temp_file.close()

with MyFile("1.txt", "rb") as file:
    file_data = file.read(20)
    print("正在使用资源 数据为:%s" % file_data)

 进入上文 获取资源
正在使用资源 数据为:b'context manager'
进入下文 关闭资源

1 o = MyFile()创建一个实例对象o
2 调用实例对象o 上文-方法__enter__ 获取资源 将资源赋值给file
3 调用file执行操作
4 调用实例对象o 下文-方法__exit__ 关闭刚刚使用的资源file

 __exit__(self, exc_type, exc_val, exc_tb)

exc_type代表异常类型,exc_value代表异常信息, exc_tb代表异常栈的跟踪信息(是一个异常对象 <traceback object at 0x0000021D44E91B48>)。

with执行体正常执行时,三者的值为None。

当with执行体出现异常时,三个参数会接受异常的信息,__exit__()方法会执行完,关闭文件。异常信息需要处理不然会抛出异常,所以要在with执行体内加入try-except进行捕获。

实现上下文管理器

Python 还提供了一个 contextmanager 的装饰器,更进一步简化了上下文管理器的实现方式。通过 yield 将函数分割成两部分,yield 之前的语句在 __enter__ 方法中执行,yield 之后的语句在 __exit__ 方法中执行。紧跟在 yield 后面的值是函数的返回值。

  •  from contextlib import contextmanager
  • @contextmanager
  • yield
from contextlib import contextmanager

@contextmanager
def myopen(name, mode):
    """提供上文 和 下文"""
    # 上文
    print("进入上文 获取资源")
    tfile = open(name, mode)

    yield tfile
    # 下文
    print("进入下文  关闭资源")
    tfile.close()

with myopen("1.txt", "rb") as file:
    file_data = file.read(20)
    print("正在使用资源 数据为:%s" % file_data)

进入上文 获取资源
正在使用资源 数据为:b'context manager'
进入下文  关闭资源

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值