python中上下文管理器和with语句

1. 上下文管理器

一个类只要实现了__enter__()和__exit__()这个两个方法,通过该类创建的对象我们就称之为上下文管理器。

上下文管理器可以结合with语句实现简洁而强大的功能

2.定义上下文管理器对象

class File(object):

    # 初始化方法
    def __init__(self, file_name, file_model):
        # 定义变量保存文件名和打开模式
        self.file_name = file_name
        self.file_model = file_model

    # 上文方法
    def __enter__(self):
        print("进入上文方法")
        # 返回文件资源
        self.file = open(self.file_name,self.file_model)
        return self.file

    # 下文方法
    def __exit__(self, exc_type, exc_val, exc_tb):
        print("进入下文方法")
        self.file.close()


if __name__ == '__main__':

    # 使用with管理文件
    with File("1.txt", "r") as file:
        file_data = file.read()
        print(file_data)

说明:

  • enter方法称为上文方法,通过此方法获取操作对象
  • exit方法为下文方法,用于关闭资源等操作

3.结合with语句使用:

语法

with 上下文对象() as 操作对象:
        具体操作;

说明:

  • with语句执行时,会调用enter方法获取到操作对象
  • with语句执行完成时,不管执行过程中有没有异常,总会调用exit方法

示例:

# 使用with管理文件
    with File("1.txt", "r") as file:
        file_data = file.read()
        print(file_data)

说明:上面代码完成打开文件并读取文件操作,不需要再写关闭文件功能

4.装饰器方式定义上下文管理器

@contextmanager 的装饰器,可装饰一个函数,使函数转化为一个上下文管理器,更进一步简化了上下文管理器的实现方式。通过 yield 将函数分割成两部分,yield 上面的语句在 __enter__ 方法中执行,yield 下面的语句在 __exit__ 方法中执行,紧跟在 yield 后面的参数是函数的返回值。

要使用contextmanager,需要导入对应模块:

from contextlib import contextmanager

装饰器法上下文管理器使用:

# 导入装饰器
from contextlib import contextmanager


# 装饰器装饰函数,让其称为一个上下文管理器对象
@contextmanager
def my_open(path, mode):
    try:
        # 打开文件
        file = open(file_name, file_mode)
        # yield之前的代码好比是上文方法
        yield file
    except Exception as e:
        print(e)
    finally:
        print("over")
        # yield下面的代码好比是下文方法
        file.close()

# 使用with语句
with my_open('out.txt', 'w') as f:
    f.write("hello , the simplest context manager")

 

5.  open就是一个上下文管理器:

# 1、以写的方式打开文件
with open("1.txt", "w") as f:
    # 2、读取文件内容
    f.write("hello world")

 

posted @ 2021-01-07 21:33  foreast  阅读(94)  评论(0编辑  收藏  举报