zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ios之单例模式
    ios之申请后台延时执行和做一个假后台的方法
    ios之gcd浅析
    ios之归档demo
    ios之快速领会VFL的demo
    ios之网络异常与正常视图的切换
    POJ 2280 Amphiphilic Carbon Molecules 极角排序 + 扫描线
    linux pthread
    directdraw显示yuv422(yuy2)
    nginx高效学习方法
  • 原文地址:https://www.cnblogs.com/yunxiaofei/p/11218207.html
Copyright © 2011-2022 走看看