中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python基礎之with語句和上下文管理器怎么使用

發布時間:2023-04-28 17:27:47 來源:億速云 閱讀:136 作者:iii 欄目:開發技術

這篇文章主要介紹了Python基礎之with語句和上下文管理器怎么使用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Python基礎之with語句和上下文管理器怎么使用文章都會有所收獲,下面我們一起來看看吧。

1. with語句的使用

基礎班向文件中寫入數據的示例代碼:

 # 1、以寫的方式打開文件
 f = open("1.txt", "w")
 # 2、寫入文件內容
 f.write("hello world")
 # 3、關閉文件
 f.close()

代碼說明:

文件使用完后必須關閉,因為文件對象會占用操作系統的資源,并且操作系統同一時間能打開的文件數量也是有限的

這種寫法可能出現一定的安全隱患,錯誤代碼如下:

 # 1、以讀的方式打開文件
 f = open("1.txt", "r")
 # 2、讀取文件內容
 f.write("hello world")
 # 3、關閉文件
 f.close()

運行結果:

Traceback (most recent call last):
  File "/home/python/Desktop/test/xxf.py", line 4, in <module>
    f.write("hello world")
io.UnsupportedOperation: not writable

代碼說明:

由于文件讀寫時都有可能產生IOError,一旦出錯,后面的f.close()就不會調用。

為了保證無論是否出錯都能正確地關閉文件,我們可以使用try ... finally來解決

安全寫法, 代碼如下:

try:
    # 1、以讀的方式打開文件
    f = open("1.txt", "r")
    # 2、讀取文件內容
    f.write("xxxxx")
 
except IOError as e:
    print("文件操作出錯", e)
 
finally:
    # 3、關閉文件
    f.close()

運行結果:

文件操作出錯 not writable

這種方法雖然代碼運行良好,但是缺點就是代碼過于冗長,并且需要添加try-except-finally語句,不是很方便,也容易忘記.

在這種情況下,Python提供了 with 語句的這種寫法,既簡單又安全,并且 with 語句執行完成以后自動調用關閉文件操作,即使出現異常也會自動調用關閉文件操作。

with 語句的示例代碼:

# 1、以寫的方式打開文件
with open("1.txt", "w") as f:
    # 2、讀取文件內容
    f.write("hello world")

2. 上下文管理器

一個類只要實現了__enter__()和__exit__()這個兩個方法,通過該類創建的對象我們就稱之為上下文管理器。

上下文管理器可以使用 with 語句,with語句之所以這么強大,背后是由上下文管理器做支撐的,也就是說剛才使用 open 函數創建的文件對象就是就是一個上下文管理器對象。

自定義上下文管理器類,模擬文件操作:

定義一個File類,實現 __enter__() 和 __exit__()方法,然后使用 with 語句來完成操作文件, 示例代碼:

class File(object):
 
    # 初始化方法
    def __init__(self, file_name, file_model):
        # 定義變量保存文件名和打開模式
        self.file_name = file_name
        self.file_model = file_model
 
    # 上文方法
    def __enter__(self):
        print("進入上文方法")
        # 返回文件資源
        self.file = open(self.file_name,self.file_model)
        return self.file
 
    # 下文方法
    def __exit__(self, exc_type, exc_val, exc_tb):
        print("進入下文方法")
        self.file.close()
 
 
if __name__ == '__main__':
 
    # 使用with管理文件
    with File("1.txt", "r") as file:
        file_data = file.read()
        print(file_data)

運行結果:

進入上文方法
hello world
進入下文方法

代碼說明:

  • __enter__表示上文方法,需要返回一個操作文件對象

  • __exit__表示下文方法,with語句執行完成會自動執行,即使出現異常也會執行該方法。

3. 上下文管理器的另外一種實現方式

假如想要讓一個函數成為上下文管理器,Python 還提供了一個 @contextmanager 的裝飾器,更進一步簡化了上下文管理器的實現方式。通過 yield 將函數分割成兩部分,yield 上面的語句在 __enter__ 方法中執行,yield 下面的語句在 __exit__ 方法中執行,緊跟在 yield 后面的參數是函數的返回值。

# 導入裝飾器
from contextlib import contextmanager
 
# 裝飾器裝飾函數,讓其稱為一個上下文管理器對象
@contextmanager
def my_open(path, mode):
    try:
        # 打開文件
        file = open(file_name, file_mode)
        # yield之前的代碼好比是上文方法
        yield file
    except Exception as e:
        print(e)
    finally:
        print("over")
        # yield下面的代碼好比是下文方法
        file.close()
 
# 使用with語句
with my_open('out.txt', 'w') as f:
    f.write("hello , the simplest context manager")

關于“Python基礎之with語句和上下文管理器怎么使用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Python基礎之with語句和上下文管理器怎么使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

喀什市| 中方县| 通渭县| 延川县| 洛川县| 惠安县| 富宁县| 玉环县| 龙州县| 米脂县| 新巴尔虎右旗| 南昌县| 亚东县| 延寿县| 宁海县| 南川市| 澄江县| 镇远县| 石棉县| 衡阳县| 信宜市| 许昌县| 土默特左旗| 沅江市| 利津县| 拜泉县| 都安| 潮州市| 嘉定区| 米脂县| 泰和县| 大厂| 栾川县| 康马县| 滁州市| 理塘县| 巩留县| 郯城县| 佛山市| 刚察县| 房山区|