Python进阶系列(十七)

简介: Python进阶系列(十七)

上下文管理器(Context managers)


上下文管理器允许你在有需要的时候,精确地分配和释放资源。

使用上下文管理器最广泛的案例就是with语句了。

想象下你有两个需要结对执行的相关操作,然后还要在它们中间放置一段代码。

上下文管理器就是专门让你做这种事情的。举个例子:

with open('some_file', 'w') as opened_file:
    opened_file.write('Hola!')
复制代码

上面这段代码打开了一个文件,往里面写入了一些数据,然后关闭该文件。如果在往文件写数据时发生异常,它也会尝试去关闭文件。上面那段代码与这一段是等价的:

file = open('some_file', 'w')
try:
    file.write('Hola!')
finally:
    file.close()
复制代码

当与第一个例子对比时,我们可以看到,通过使用with,许多样板代码(boilerplate code)被消掉了。 这就是with语句的主要优势,它确保我们的文件会被关闭,而不用关注嵌套代码如何退出。

上下文管理器的一个常见用例,是资源的加锁和解锁,以及关闭已打开的文件(就像我已经展示给你看的)。

让我们看看如何来实现我们自己的上下文管理器。这会让我们更完全地理解在这些场景背后都发生着什么。

基于类的实现


一个上下文管理器的类,最起码要定义__enter__和__exit__方法。

让我们来构造我们自己的开启文件的上下文管理器,并学习下基础知识。

class File(object):
    def __init__(self, file_name, method):
        self.file_obj = open(file_name, method)
    def __enter__(self):
        return self.file_obj
    def __exit__(self, type, value, traceback):
        self.file_obj.close()
复制代码

通过定义__enter__和__exit__方法,我们可以在with语句里使用它。我们来试试:

with File('demo.txt', 'w') as opened_file:
    opened_file.write('Hola!')
复制代码

我们的__exit__函数接受三个参数。这些参数对于每个上下文管理器类中的__exit__方法都是必须的。我们来谈谈在底层都发生了什么。

   1. with语句先暂存了File类的__exit__方法

   2. 然后它调用File类的__enter__方法

   3. __enter__方法打开文件并返回给with语句

   4. 打开的文件句柄被传递给opened_file参数

   5. 我们使用.write()来写文件

   6. with语句调用之前暂存的__exit__方法

   7. __exit__方法关闭了文件


作者:zhulin1028

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章
|
14小时前
|
Java Python
Python进阶之旅:深入理解变量作用域、垃圾回收、拷贝机制与异常处理
Python进阶之旅:深入理解变量作用域、垃圾回收、拷贝机制与异常处理
|
14小时前
|
Python
Python面向对象进阶:深入解析面向对象三要素——封装、继承与多态
Python面向对象进阶:深入解析面向对象三要素——封装、继承与多态
|
8天前
|
SQL 关系型数据库 MySQL
Python进阶第二篇(Python与MySQL数据库)
Python进阶第二篇(Python与MySQL数据库)
|
8天前
|
Python
Python进阶第一篇(Python的面向对象)
Python进阶第一篇(Python的面向对象)
|
8天前
|
Python
Python基础第六篇(Python函数进阶)
Python基础第六篇(Python函数进阶)
|
12天前
|
开发者 Python
Python进阶--装饰器
Python进阶--装饰器
|
14天前
|
程序员 Python
Python进阶:错误和异常处理,你的代码还能更健壮吗?
【6月更文挑战第12天】Python编程中的错误和异常处理对确保代码健壮性至关重要。当遇到如文件未找到或除零运算等错误时,Python会抛出异常。通过try-except语句可以捕获并处理异常,例如处理ZeroDivisionError时,可以在except块中给出错误信息。此外,可使用else和finally块进行更精细的控制,以及通过继承Exception类定义自定义异常。掌握这些技巧能帮助编写出更稳定且能优雅处理异常的代码。
|
15天前
|
人工智能 小程序 数据挖掘
Python进阶之路:谁说“菜鸟”不能变“凤凰”?
【6月更文挑战第11天】Python初学者面对复杂代码时往往感到困难,但持续学习和实践能助其成长。巩固基础,深入学习高级特性,扩展到如数据分析、AI等领域,以及参与实践和阅读优秀代码,都是进阶的关键。装饰器是简化代码的工具,例如示例展示的my_decorator,可增强函数功能。保持热情与毅力,新手将不断进步。
|
18天前
|
存储 算法 开发者
掌握Python编程:从基础到进阶
【6月更文挑战第7天】本文将引导读者了解并掌握Python编程语言的基础知识和进阶技巧。我们将从Python的基本语法开始,逐步深入到更复杂的主题,如数据结构和算法、面向对象编程以及网络编程。无论你是编程新手还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。
|
20天前
|
算法 开发工具 数据安全/隐私保护
练手必备!Python编程实战—23个有趣的实战项目带你快速进阶
Python的练手项目有哪些值得推荐? 已经有6.4W关注,700W次浏览,回答都有450条了,本来遇到这种问题我是不会回答的,毕竟已经有太多人给出了答案,我再去回答就没什么意义了。 但想了想确实有很多刚学Python的并不清楚从哪里去找项目来练手,于是就有了这篇文章,基于这个目的,我也是找了好久,最后还是选择了分享这份手册,毕竟里面有细致的讲解,确实更适合练手一些。