python中的上下文管理器

Posted yunxiaofei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中的上下文管理器相关的知识,希望对你有一定的参考价值。

1. 基本认识

无论什么编程语言,资源的使用是非常常见的,例如文件操作、数据库连接等。但是这些资源的供应是有限的,因此在使用后要确保释放这些资源。如果这些资源不被释放,可能会因为资源不足导致系统变慢或崩溃。如果有一种自动的机制可以打开和关闭资源将会非常有帮助。其他语言经常使用try-except-finally来实现,python中可以通过上下文管理器实现,最常见的就是with语句进行文件操作了。

with open("out.txt", w) as f:
    f.write("hello, nice to meet you.")

文件描述符(file descriptor)就是一种有限的资源,系统能打开的文件数量是有限制的。

2. 实现方式

上下文管理器(context managers)可以通过类或函数(生成器、装饰器)来实现。

2.1 通过类实现上下文管理器

如果使用类来实现,我们要确保类中包含__enter__()和__exit__()方法。__enter__()方法返回需要被管理的资源,__exit__()方法执行清理操作,不返回任何东西。

class ContextManager(object):
    def __init__(self):
        print("init method called.")
        
    def __enter__(self):
        print("enter method called.")
        return self
    
    def __exit__(self, exc_type, exc_value, exc_traceback):
        print("exit method called.")
        
with ContextManager() as manager:
    print("do something...")

输出内容:

================================

init method called.
enter method called.
do something...
exit method called.

================================

首先调用init方法初始化,然后调用了enter方法,接着执行with语句中定义的代码块,最后执行exit方法。

2.2 通过生成器、装饰器实现

从contextlib模块导入contextmanager,在函数定义前添加@contextmanager装饰器。

from contextlib import contextmanager

@contextmanager
def open_file(filename):
    f = open(filename, "w")
    yield f
    f.close
    
with open_file("out.txt") as f:
    f.write("new text.")

参考链接:

[1] https://www.geeksforgeeks.org/context-manager-in-python/

[2] https://eastlakeside.gitbooks.io/interpy-zh/content/context_managers/implement_as_generator.html

以上是关于python中的上下文管理器的主要内容,如果未能解决你的问题,请参考以下文章

深入理解 Python 中的上下文管理器

python 一个语句中的多个上下文管理器

python2.7高级编程 笔记一(Python中的with语句与上下文管理器学习总结)

python中的上下文管理器

Python上下文管理器

python上下文管理器