zoukankan      html  css  js  c++  java
  • with与上下文管理器

    with关键字

    在程序中,有很多连接需要关闭和打开,如文件的读写、数据库连接、socket,频繁的手动关闭比较麻烦,就出现的with。
    例如对文件的操作正常情况下我们是这样的:

    f = open("a.txt", "w")
    f.write("python")
    f.close()
    

    使用with关键字以后:

    with open("a.txt", "r") as f:
            f.write("Python")
    

    这是一种更加简洁的语法。

    上下文管理器

    任何实现了 __ enter __ () 和 __ exit __ () 方法的对象都可称之为上下文管理器,上下文管理器对象可以使用 with 关键字。显然,文件(file)对象也实现了上下文管理器。
    __ enter __ () 方法返回资源对象,这里就是你将要打开的那个文件对象,__ exit __ () 方法处理一些清除工作。

    自己实现一个上下文管理器

    class File:
        def __init__(self, file_name, mode):
            self.file_name = file_name
            self.mode = mode
    
        def __enter__(self):
            self.f = open(self.file_name, self.mode, encoding="utf-8")
            print("enter")
            return self.f
    
        def __exit__(self, *args):
            self.f.close()
            print("exit")
    
    
    with File("a.txt", "w") as f:
        f.write("你好")
    

    使用contextmanager 装饰器实现上下文管理器

    Python 还提供了一个 contextmanager 的装饰器,更进一步简化了上下文管理器的实现方式。通过 yield 将函数分割成两部分,yield 之前的语句在 __ enter __ 方法中执行,yield 之后的语句在 __ exit __ 方法中执行。紧跟在 yield 后面的值是函数的返回值。

    from contextlib import contextmanager
    
    @contextmanager
    def file(file_name, mode):
        f = open(file_name,mode,encoding="utf-8")
        yield f
        f.close()
    
    with file("a.txt", "w") as f:
        f.write("你fdf好")
    
  • 相关阅读:
    python 3字符编码
    python 数据类型 datatype
    部署python django程序
    linux centos7安装python3
    关于mysql数据库优化
    关于bottle WEB框架中签名cookie的一点理解
    1111
    bottle框架剖析
    the difference __str__ and __repr__
    property getitem setitem
  • 原文地址:https://www.cnblogs.com/lxy0/p/11433035.html
Copyright © 2011-2022 走看看