python上下文管理

2020-12-21  本文已影响0人  Andy_1ee

什么是上下文管理

上下文:context的直译, 指的是代码执行过程中的前后状态
上下文管理器:python上下文管理器规定了某个对象的使用范围, 在进入或离开使用范围的时候执行相应的操作,用于资源的获取或释放
上下文协议:实现了enterexit方法,也就是实现了上下文协议

上下文管理器的创建

方法一:

在python类中实现了enterexit方法后, 调用这个类或者实例化对象,就会生成一个上下文管理器
上下文管理器配合 with方法使用, 可以自动执行enter方法, 并将enter方法的返回值赋值给 as 后面的从句变量
参考代码示例如下:

class MyOpen:
    def __init__(self, path, mode, encoding='utf-8'):
        print('__init__')
        self.open = open(path, mode, encoding=encoding)

    def __enter__(self):
        print('__enter__')
        return self.open

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('__exit__')
        self.open.close()

with MyOpen('/test.txt', 'r') as f:
    print("coding")

# 代码执行结果
__init__
__enter__
coding
__exit__
方法二:

使用contextlib模块实现上下文管理器
在contextlib模块下有一个 contextmanage方法, 可以将被装饰的对象升级为上下文管理器

from contextlib import contextmanager

@contextmanager
def my_open(path, mode, encoding='utf-8'):
    r_f = open(path, mode, encoding=encoding)
    print('file open')
    yield r_f
    print('file close')
    r_f.close()

with my_open(r'/test.txt', 'r') as c_f:
    print(c_f)

# 代码执行结果
file open
<_io.TextIOWrapper name='/test.txt' mode='r' encoding='utf-8'>
file close

上下文管理器的使用场景

  1. 用于资源的获取以及释放
    在获取例如文件句柄, 数据库资源时可以使用上下文管理器, 隐形的获取及释放资源
  2. 用于错误的获取(此方法还未实践)
上一篇下一篇

猜你喜欢

热点阅读