码迷,mamicode.com
首页 > 编程语言 > 详细

python中的上下文管理器

时间:2019-07-20 17:21:15      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:连接   代码块   ext   ret   def   self   https   script   参考   

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中的上下文管理器

标签:连接   代码块   ext   ret   def   self   https   script   参考   

原文地址:https://www.cnblogs.com/yunxiaofei/p/11218207.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!