如何实现上下文管理器
上下文管理器with
首先我们需要了解什么上下文管理器是做什么?
以下通过一个例子让大家明白。
# 例1 常规写法
fp = open('a.txt')
fp.read()
fp.close()
# 例2 自带上下文管理器写法with
with open('a.txt') as fp:
fp.read()
我们通过以上例子可以看出,
- 使代码写的更加简单了
- 实现了文件的自动关闭,避免了文件的打开忘记关闭的现场产生
如何实现自定义一个上下文管理器的方法呢?
1.自定义上下文管理器类
-
1.需要实现__enter__魔法方法
此方法主要是在操作之前的前置操作
-
2.需要实现__exit__魔法方法
此方法用于操作完成之后的最后收尾
例题:自定义文件类
class MyFile():
def __init__(self, path, mode, code='utf-8'):
self.path = path
self.mode = mode
self.code = code
def __enter__(self):
self.f = open(self.path, mode=self.mode, encoding=self.code)
print('成功建立文件')
return self.f
def __exit__(self, exc_type, exc_val, exc_tb):
self.f.close()
print('成功关闭文件')
if __name__ == '__main__':
with MyFile('a.txt', 'wt') as f:
f.write('abc')
print(f)
# 输出结果:
# 成功建立文件
# <_io.TextIOWrapper name='a.txt' mode='wt' encoding='utf-8'>
# 成功关闭文件
通过以上例子可以看出:
- 上下文管理器,在建立文件之前,是通过__enter__魔法方法来实现的
- 然后在文件操作执行完成之后,通过__exit__魔法方法自动实现关闭的功能
2.自定义生成器函数+上下文管理器的装饰方法 生成上下文管理器
-
首先需要 from contextlib import contextmanager
导入contextmanager装饰器
-
其次制作一个生成器,然后用该装饰器去装饰即可.
这样就可以达到制作一个上下文管理器的目的了
from contextlib import contextmanager
@contextmanager
def fun(path, mode, code='utf-8'):
f = open(path, mode=mode, encoding=code)
try:
print('生成文件了')
yield f
finally:
f.close()
print('关闭文件了')
if __name__ == '__main__':
with fun('b.tat', 'wt') as f:
f.write('b')
print(f)
# 输出结果:
# 生成文件了
# <_io.TextIOWrapper name='b.tat' mode='wt' encoding='utf-8'>
# 关闭文件了
通过以上方法可以看出,通过自定义生成器也能制作一个上下文管理器
在try和yield之间 可以写函数体的功能,finally 实现最后完成之后要做的操作部分!
这样我们就完成了如何从类和函数来制作上下文管理器!
新人若有写的不足或者疏漏错误的地方,欢迎大家指出,感谢你的观看!

浙公网安备 33010602011771号