Python with
2023-12-31 12:43:04
    		1. 什么是with语句?
with是一个用于上下文管理的关键字,在Python 2.5版本引入了这个特性。它提供了一种更加优雅的方式来管理资源,比如文件、网络连接、数据库连接等。通过使用with语句,我们可以确保在进入代码块之前获取资源,并在代码块执行完成后自动释放资源,无论代码块是否发生异常。
2. 使用with语句的好处
使用with语句相比传统的资源管理方式(如使用try和finally)有以下好处:
- 代码更简洁: with语句使资源的获取和释放变得简单明了,减少了冗余代码,使代码更易读和维护。
- 安全性: with语句能够确保资源在正确的时候被释放,即使在代码块中发生异常,资源也能够被正确地释放,避免资源泄漏。
- 可读性: with语句的代码结构更加清晰,将资源的获取和释放放在一起,使代码的意图更加明确。
3. 使用with语句的示例
让我们看一个使用with语句处理文件的示例:
with open('example.txt', 'r') as file:
    content = file.read()
    print(content)
# 文件在此处自动关闭,无需显式调用file.close()
4. 自定义上下文管理器
除了使用Python内置的上下文管理器(如open()函数返回的文件对象),我们还可以自定义上下文管理器。自定义上下文管理器需要实现__enter__()和__exit__()方法。这使得with语句非常灵活,适用于各种资源管理情况。
class MyContext():
    def __enter__(self):
        print('enter')
        return self  # 注意必须要返回自身
    def do_hello(self):
        print(f'hello {self.__class__}')
    def __exit__(self, exc_type, exc_val, traceback):
        print('exit')
if __name__ == '__main__':
    # 1.演示调用流程
    with MyContext() as mc:
        mc.do_hello()  # 此处就算出现异常,__exist__方法也能正常执行
    # Output:
    # enter
    # hello <class '__main__.MyContext'>
    # exit
    # 2.上面代码可以转换成
    mc = MyContext()
    mc.__enter__()
    try:
        mc.do_hello()
    finally:
        mc.__exit__(None, None, None)
4. 多个上下文管理器
在一个代码块中,您还可以使用多个上下文管理器,每个上下文管理器通过逗号分隔。例如,如果您想同时处理多个文件,可以这样做:
with open('file1.txt', 'r') as file1, open('file2.txt', 'r') as file2:
    # 在这里处理file1和file2的内容
5. 其他示例
计时器
import time
class Timer:
    start_time: float = 0.0
    end_time: float = 0.0
    def __enter__(self):
        self.start_time = time.time()
        return self
    def __exit__(self, exc_type, exc_val, traceback):
        self.end_time = time.time()
    @property
    def elapse_time(self):
        return self.end_time - self.start_time
t = Timer()
with t:
    # 模拟耗时
    time.sleep(3)
print(t.elapse_time)
6. 总结
在Python中,with语句提供了一种优雅的方式来管理资源,确保在进入和退出代码块时资源得到正确的分配和释放。它使得代码更加简洁、安全,并提高了可读性。我们可以使用with语句处理文件、数据库连接、网络连接等,也可以自定义上下文管理器来适应各种资源管理场景。通过充分利用with语句,我们可以写出更加优雅和可靠的Python代码。
7. 参考
    			文章来源:https://blog.csdn.net/yimtcode/article/details/135314777
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
    	本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!