1.  
  2. 主页
  3.  / 
  4. Python基础到高级
  5.  / 
  6. 魔术方法
  7.  / 
  8. 上下文管理

上下文管理

支持上下文管理的对象

在介绍文件IO的那篇文章中,说到了使用with的来做文件的上下文管理

这里open方法,返回的是一个文件对象,而文件对象是支持上下文管理的,支持上下文管理的对象是可以使用with的形式来处理数据的

在一个对象中同时出现__enter__和__exit__方法,那么这个对象就是支持上下文管理的对象

进入with语句块之前,会执行__enter__方法,退出with语句块之前,会返还__exit__方法

为什么我们会将这种现象叫做上下文呢?

with在开启一个语句块的时候,执行这个语句块之前,会执行__enter__方法,执行这个语句块之后,会执行__exit__方法,也就是说在这个语句块的前后会执行一些操作,这样的行为叫做上下文管理

上下文管理是安全的,既是with块抛出了异常,__enter__和__exit__方法,也还是会执行的

即使with块中主动退出解释器,抛出SystemExit异常的情况下,with块也是会执行__enter__和__exit__方法

with的as字句可以获取__enter__方法的返回值

有几点需要注意下:

  • __enter__方法除了self参数外,不带任何参数
  • __exit__的return返回值,是没有办法获取到,但是当with块中抛出异常的时候,__exit__的return返回值是False的时候会向上抛出异常,返回True会屏蔽异常

刚刚介绍了说__enter__方法除了self参数外,是不带任何参数,但是__exit__是有三个位置参数的

上下文管理的应用场景例子

代码块运行时间计算

上面的例子的是根据一组代码块来实现的,下面介绍一个可以对函数进行装饰的应用场景

上面的例子变可以直接作用于函数了,和装饰器的用法是一样的,是不是感觉Python的魔术方法非常NB

contextlib.contextmanager装饰器

contextlib.contextmanager装饰器可以将一个生成器转换一个上下文管理

上下文管理的具体应用场景

凡是在代码块前后插入代码的场景统统适用于上下文管理

  • 资源管理
  • 权限验证
  • 等等…
这篇文章对您有用吗?

我们要如何帮助您?

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注