• python中的with与上下文管理器


    #转载请留言联系

    很多人平时需要打开文件进行读取写入操作时,通常这样:

    f = open('文件路径','w')
    f.write(data)
    f.close

    这样写有一个潜在的问题,如果在调用 write 的过程中,出现了异常进而导致后续代码无法继续执行,close 方法无法被正常调用,因此资源就会一直被该程序占用者释放。那么该如何改进代码呢?

    对于系统资源如文件、数据库连接、socket 而言,应用程序打开这些资源并执行完业务逻辑之后,必须做的一件事就是要关闭(断开)该资源。

    比如 Python 程序打开一个文件,往文件中写内容,写完之后,就要关闭该文件,否则会出现什么情况呢?极端情况下会出现 "Too many open files" 的错误,因为系统允许你打开的最大文件数量是有限的。总之,能够将打开使用的资源 进行自动关闭是一个非常不错的手段。

    那么,怎么才能在不需要的时候自动关闭呢?很简单,用with。

    with open('文件路径','w') as f
    f.write(data)

    with的原理到底是什么呢?怎么这么神奇?

    其实它是通过上下文管理器实现这么一个功能的。

    上下文管理器是什么东西呢?其实上下文管理器和迭代器有点相似。任何实现了 __enter__() 和 __exit__() 方法的对象都可称之为上下文管理器   ,上下文管理器可以使用with简化操作。

    现在来写一个实现文件自动关闭的上下文管理器~

    class File():
        def __init__(self,file_name,mode):
            self.file_name = file_name
            self.mode = mode
    
        def __enter__(self):
            """上文"""
            self.file_name = open(self.file_name,self.mode)
            return self.file_name
    
        def __exit__(self, exc_type, exc_val, exc_tb):
            """下文"""
            self.file_name.close()
    
    with File('./one.txt','w') as f:  #正文
        f.write("大家好")

    “上文”和“下文”对应类中的__enter__和__exit__函数。“正文”就是你的文件处理部分啦。

  • 相关阅读:
    如何在WinPE下安装xp安装版
    好用、功能强大的JQuery弹出层插件
    设计模式-旧话重提之类工厂的使用
    How can I manage Internet Explorer Security Zones via the registry?
    设计模式行为模式Behavioral Patterns()之FlexibleService模式
    how to design a new tree view control
    在C#中通过webdav操作exchange
    Yahoo! User Interface Library (哈偶然发现了这个东西)
    设计模式[2]旧话重提之工厂模式
    const和static readonly 的区别
  • 原文地址:https://www.cnblogs.com/chichung/p/9621141.html
Copyright © 2020-2023  润新知