如何实现上下文管理器

上下文管理器with

首先我们需要了解什么上下文管理器是做什么?
以下通过一个例子让大家明白。

# 例1 常规写法
fp = open('a.txt')
fp.read()
fp.close()

# 例2 自带上下文管理器写法with
with open('a.txt') as fp:
    fp.read()

我们通过以上例子可以看出,

  1. 使代码写的更加简单了
  2. 实现了文件的自动关闭,避免了文件的打开忘记关闭的现场产生

如何实现自定义一个上下文管理器的方法呢?

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'>
# 成功关闭文件

通过以上例子可以看出:

  1. 上下文管理器,在建立文件之前,是通过__enter__魔法方法来实现的
  2. 然后在文件操作执行完成之后,通过__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 实现最后完成之后要做的操作部分!
这样我们就完成了如何从类和函数来制作上下文管理器!
新人若有写的不足或者疏漏错误的地方,欢迎大家指出,感谢你的观看!

posted @ 2021-08-10 18:34  缘兮Fate  阅读(136)  评论(0)    收藏  举报