with open為什么會自動關閉文件流


操作文件我們通常需要手動關閉文件流,可是通過with open()的時候卻可以自動關閉,這是為什么呢?其實這就是上下文管理器。我們來看一個例子

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
你是否想過一個問題,打開文件會拋出異常,通常打開文件后也需要關閉文件流,為什么用 with open()語句可以不用手動關閉文件流呢?
這就是上下文管理器
"""

class Sample:

    def __init__(self):
        # 首先執行這個方法
        print("__init__")

    def __enter__(self):
        # 然后會自動調用這個方法,可以理解為獲取資源
        print("__enter__")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        # 這個函數會自動調用,當跳出with語句的時候,目的是為了釋放資源
        print("__exit__")

    def toDo(self):
        print("to do something")

"""
__enter__和__exit__構成了上下文管理器
"""
# 這個用法是不是很像 with open()呢?
with Sample() as sample:
    print("aaa")

這個上下文管理器還可以簡化一下

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
如何把上下文管理器更加簡化一下呢?
"""

import contextlib

@contextlib.contextmanager # 這個裝飾器把下面的函數包裝成上下文管理器,主要利用了yiele的特性
def myFun(arg1):
    print("begin", arg1)  # 相當於 __enter__ 里面的代碼
    yield {}  # 這里必須有個生成器
    print("finished")  # 相當於 __exit__ 里面的代碼


with myFun("AAA") as my:
    print("BBB")


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM