Python中的上下文管理器和with语句的使用

 更新时间:2018年04月17日 13:46:20   作者:Yabea  
本篇文章主要介绍了Python中的上下文管理器和with语句的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Python2.5之后引入了上下文管理器(context manager),算是Python的黑魔法之一,它用于规定某个对象的使用范围。本文是针对于该功能的思考总结。

为什么需要上下文管理器?

首先,需要思索下为什么需要引入上下文管理器。

在正常情况下,管理各种系统资源(如文件)、数据库连接时,通常是先打开这些资源,执行完相应的业务逻辑,最后关闭资源。

举两个例子:

1.使用Python打开一个文件写入内容,之后需要关闭这个文件。如果不正常关闭的话可能会在文件操作时出现异常,因为系统允许你打开的文件的最大数是有限的。

2.在数据库连接时也是存在类似问题,数据库的连接算是一种比较昂贵的资源,若连接过多而没有及时关闭的话,就可能出现不能继续连接的异常错误。

但是,很多程序员经常会忘记关闭文件,或者关闭数据库的连接。这时候就引入了上下文管理器,它可以在你不需要该对象的时候,自动关闭它。

上下文管理器怎么使用?

上下文管理器的语法是:with...as...

实例:文件操作

print "不使用上下文管理器"
print "*" * 30
f = open('file.py', 'w')
print f.closed
f.write("# Hello World")
f.close()
print f.closed

print "\n使用上下文管理器"
print "*" * 30
with open("file.py", 'w') as f:
  print f.closed
  f.write('# Hello Python')
print f.closed

这里通过.closed比较,我们可以看到上下文管理器可以自动关闭文件,对于上下文管理器而言,有隶属于它的程序块,当隶属于它的程序块执行结束的时候(判断缩进),上下文管理器将自动关闭文件。
 上述实例,也可以使用try...except...来实现,同样可以很直观的看到使用with...as...语句之后,代码确实相对更加简洁。

上下文管理实现机制

因为文件对象是Python的内置对象,内置了上下文管理的特殊方法,所以它可以使用with语句。在Python中,任何对象,只要实现了上下文管理,就可以使用with语句,实现上下文管理需要通过__enter__和__exit__这两个方法来实现。

关于这两个方法:

  1. enter(self):进入该对象时调用此方法,返回值将放入with...as...语句中的as说明的变量中
  2. exit(self, type, value, tb):离开上下文管理器时调用该方法,如果有异常出现,返回False,type、value和tb将分别表示异常的类型、值和追踪信息,传递出上下文显示;如果没有异常,则三个变量的值均为None。

with 上下文管理器:
    语法体

当with语句遇到上下文管理器时,就会在执行语法体之前,先执行__enter__方法,然后再执行语法体,执行完语法体之后,执行__exit__方法。

上下文管理器实现

使用Python2.7X实现一个上下文管理器:

class Context(object):

  def __init__(self):
    print "实例化一个对象"

  def __enter__(self):
    print "获取该对象"

  def __exit__(self, exc_type, exc_val, exc_tb):
    print "退出该对象"

temp = Context()

with temp:
  print "执行体"

这样,__enter__方法和__exit__方法的调用过程就很明晰。

contextLib

在contextlib中,提供了contextmanager装饰器,通过yield返回函数将函数分隔为两部分,yield之前的语句在__enter__中执行,yield之后的语句在__exit__中执行,简化了上下文管理器的实现方式:

总结:通过上下文管理器,我们可以更好的控制对象在不同区间的特性,并且可以使用with语句替代try...except方法,使得代码更加的简洁,主要的使用场景是访问资源,可以保证不管过程中是否发生错误或者异常都会执行相应的清理操作,释放出访问的资源。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • python实现加密的方式总结

    python实现加密的方式总结

    这篇文章主要介绍了python实现加密的方式总结,文中给大家提到了python中加密的注意点,通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • django初始化数据库的实例

    django初始化数据库的实例

    今天小编就为大家分享一篇django初始化数据库的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • python datetime 和时间戳互相转换问题

    python datetime 和时间戳互相转换问题

    time和datetime都是Python中的内置模块(不需要安装,直接可以使用),都可以对时间进行获取,对时间格式进行转换,如时间戳和时间字符串的相互转换,本文先给大家介绍python datetime 和时间戳互转问题,感兴趣的朋友一起看看吧
    2022-11-11
  • python开发利器之ulipad的使用实践

    python开发利器之ulipad的使用实践

    Ulipad是一个国人limodou编写的专业Python编辑器,它基于wxpython开发的GUI(图形化界面)。下面这篇文章主要介绍了python开发利器之ulipad的使用实践,文中介绍的非常详细,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-03-03
  • Python结合requests和Cheerio处理网页内容的操作步骤

    Python结合requests和Cheerio处理网页内容的操作步骤

    Python因其简洁明了的语法和强大的库支持,成为了编写爬虫程序的首选语言之一,requests库是Python中用于发送HTTP请求的第三方库,而Cheerio库则是一个用于解析HTML和XML文档的库,本文给大家介绍了Python结合requests和Cheerio处理网页内容的操作步骤
    2025-01-01
  • python利用requests库进行接口测试的方法详解

    python利用requests库进行接口测试的方法详解

    在python的标准库中,虽然提供了urllib,utllib2,httplib,但是做接口测试,requests真心好,正如官方说的,“让HTTP服务人类”,一言以蔽之,说明一切,这篇文章主要给大家介绍了关于python利用requests库进行接口测试的相关资料,需要的朋友可以参考下
    2018-07-07
  • python 动态渲染 mysql 配置文件的示例

    python 动态渲染 mysql 配置文件的示例

    这篇文章主要介绍了python 动态渲染 mysql 配置文件的示例,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-11-11
  • Python的数据结构与算法的队列详解(3)

    Python的数据结构与算法的队列详解(3)

    这篇文章主要为大家详细介绍了Python的队列,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Python实现Excel表内关键字查修改删

    Python实现Excel表内关键字查修改删

    在日常办公和数据处理中,Excel作为最常用的表格工具,承载着海量业务数据,但对于有些场景也会力不从心,本文将使用Python开发一个Excel表内关键字查修改删工具,需要的可以参考下
    2025-04-04
  • python读写删除复制文件操作方法详细实例总结

    python读写删除复制文件操作方法详细实例总结

    这篇文章主要介绍了python读写删除复制文件操作方法详细实例总结,需要的朋友可以参考下
    2021-04-04

最新评论