(一)定义:
- 一个类他实现了__enter__和__exit__方法就可以称为上下文管理器(context manager)
- 用@contextmanager装饰的生成器也能被称为上下文管理器
(二)两种实现方式:
"""
如果定义了一个类,这个类实现了__enter__()方法和__exit__()方法
我们就说这个类遵守了上下文管理协议
"""
class MyContextManager(object):
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
def __enter__(self):
print('enter方法被执行')
return self
def __exit__(self, exc_type, exc_value, exc_tb):
print('退出前释放资源')
print('exit方法被执行')
def write(self, content):
print(f'你想在 "{self.filename}" 文件中写入: "{content}"')
# 实例化类的方式创建上下文管理器
my_cm = MyContextManager('demo.txt', 'w')
my_cm.write('实例化类的方式创建上下文管理器')
print('=='*25)
# 用with来创建上下文管理器
with MyContextManager('demo.txt', 'w') as f:
f.write('用with来创建上下文管理器')
"""
使用前导入from contextlib import contextmanager
用@contextmanager装饰你想要装饰的生成器,将它变成一个上下文管理器
"""
from contextlib import contextmanager
@contextmanager
def my_context_manager(name, mode, encoding):
try:
f = open(name, mode, encoding=encoding)
yield f
finally:
f.close()
with my_context_manager('demo.txt', 'w', encoding='utf-8') as f:
f.write('用装饰器装饰一个生成器来变成上下文管理器')