什么是上下文管理
上下文:context的直译, 指的是代码执行过程中的前后状态
上下文管理器:python上下文管理器规定了某个对象的使用范围, 在进入或离开使用范围的时候执行相应的操作,用于资源的获取或释放
上下文协议:实现了enter 与 exit方法,也就是实现了上下文协议
上下文管理器的创建
方法一:
在python类中实现了enter与exit方法后, 调用这个类或者实例化对象,就会生成一个上下文管理器
上下文管理器配合 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
上下文管理器的使用场景
- 用于资源的获取以及释放
在获取例如文件句柄, 数据库资源时可以使用上下文管理器, 隐形的获取及释放资源 - 用于错误的获取(此方法还未实践)
网友评论