美文网首页
with 与"上下文管理器"

with 与"上下文管理器"

作者: 午字横 | 来源:发表于2023-04-26 12:01 被阅读0次
    例子:
    def foo(filename):
        with open(filename) as f:
            tmp=f.readlines()
            print(tmp)
    
    
    f=foo('../t.txt')
    f
    
    什么是上下文管理器:

    任何实现了 __enter__()__exit__()方法的对象都可称之为上下文管理器,上下文管理器对象可以使用 with关键字。XXX类实现了上下文管理器,就可以使用 with语句

    
    class File():
        def __init__(self,filename,mode):
            self.filename=filename
            self.mode=mode
            pass
    
        def __enter__(self):
            print('entering')
            self.f=open(self.filename,self.mode)
            return self.f
    
        def __exit__(self, *args):
            print('exit')
            self.f.close()
    
    
    with File('../t.txt','r') as f:
        print([i for i in f.readlines()])
    
    with File('../t.txt','w') as f:
        f.write("hi")
    
    实现上下文管理器的另外方式:

    Python 还提供了一个 contextmanager 的装饰器,更进一步简化了上下文管理器的实现方式。
    通过 yield 将函数分割成两部分:

    • yield 之前的语句在enter方法中执行,
    • yield 之后的语句在 exit 方法中执行。
      紧跟在 yield 后面的值是函数的返回值。
    
    
    from contextlib import  contextmanager
    
    @contextmanager
    def my_open(path,mode):
        f=open(path,mode)
        yield f
        f.close()
    
    
    with my_open("../t.txt","r") as f:
        print(f.readlines())
    
    
    
    #Python 提供了 with 语法用于简化资源操作的后续清除操作,
    # 是 try/finally 的替代方法,实现原理建立在上下文管理器之上。
    # 此外,Python 还提供了一个 contextmanager 装饰器,更进一步简化上下管理器的实现方式
    
    

    2023-04-27

    相关文章

      网友评论

          本文标题:with 与"上下文管理器"

          本文链接:https://www.haomeiwen.com/subject/omjvjdtx.html