日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Python上下文管理,你真的了解嗎?

來源: 責編: 時間:2023-12-11 09:28:54 251觀看
導讀在 Python 編程中,有效地管理資源和處理異常是至關重要的。上下文管理器作為一種強大的工具,提供了一種優雅的方式來管理資源,確保它們在使用完畢后能夠被正確釋放。通過結合 with 語句,上下文管理器使得資源的獲取和釋放

在 Python 編程中,有效地管理資源和處理異常是至關重要的。上下文管理器作為一種強大的工具,提供了一種優雅的方式來管理資源,確保它們在使用完畢后能夠被正確釋放。通過結合 with 語句,上下文管理器使得資源的獲取和釋放變得簡單而可靠,同時也使得異常處理變得更加優雅和簡潔。本文將深入探討 Python 中的上下文管理器,介紹其概念、用法和實際應用,并提供豐富的代碼示例,幫助讀者更好地理解和運用這一強大的特性。H0X28資訊網——每日最新資訊28at.com

當談論 Python 中的上下文管理時,我們通常是指 with 語句和上下文管理器。上下文管理器可以讓我們更方便地管理資源,比如文件、網絡連接或者數據庫連接,同時也可以確保資源在使用完畢后得到正確的清理和釋放。在本文中,我將詳細介紹上下文管理器的概念、用法和實例,并提供豐富的代碼示例。H0X28資訊網——每日最新資訊28at.com

H0X28資訊網——每日最新資訊28at.com

一、什么是上下文管理器?

在 Python 中,上下文管理器是指實現了 __enter__ 和 __exit__ 方法的對象。當我們使用 with 語句時,會調用上下文管理器的 __enter__ 方法獲取資源,然后在 with 代碼塊執行結束后,無論是正常結束還是出現異常,都會調用 __exit__ 方法來進行清理和釋放資源。H0X28資訊網——每日最新資訊28at.com

上下文管理器可以用于許多場景,比如文件操作、線程鎖、數據庫連接等,它們能夠確保資源的正確管理和釋放,避免出現資源泄漏等問題。H0X28資訊網——每日最新資訊28at.com

一個上下文管理器的類,最起碼要定義 __enter__ 和 exit 方法。 讓我們來構造我們自己的開啟文件的上下文管理器,并學習下基礎知識。H0X28資訊網——每日最新資訊28at.com

class File(object):    def __init__(self, file_name, method):        self.file_obj = open(file_name, method)    def __enter__(self):        return self.file_obj    def __exit__(self, type, value, traceback):        self.file_obj.close()

H0X28資訊網——每日最新資訊28at.com

通過定義 __enter__ 和 __exit__ 方法,我們可以在with語句里使用它。我們來試試:H0X28資訊網——每日最新資訊28at.com

with File('demo.txt', 'w') as opened_file:    opened_file.write('Hola!')

H0X28資訊網——每日最新資訊28at.com

我們的 __exit__ 函數接受三個參數。這些參數對于每個上下文管理器類中的 __exit__ 方法都是必須的。我們來談談在底層都發生了什么。H0X28資訊網——每日最新資訊28at.com

  • with 語句先暫存了 File 類的 __exit__ 方法。
  • 然后它調用 File 類的 __enter__ 方法。
  • __enter__ 方法打開文件并返回給 with 語句。
  • 打開的文件句柄被傳遞給 opened_file 參數。
  • 我們使用 .write() 來寫文件。
  • with 語句調用之前暫存的 __exit__ 方法。
  • __exit__ 方法關閉了文件。

二、實現上下文管理器

我們也可以自定義上下文管理器,只需實現 __enter__ 和 __exit__ 方法即可。H0X28資訊網——每日最新資訊28at.com

  1. 基礎實現
python復制代碼class MyContextManager:    def __enter__(self):        print('Entering the context')        # 返回需要被管理的資源        return self    def __exit__(self, exc_type, exc_value, traceback):        print('Exiting the context')        # 在退出上下文時進行清理工作# 使用自定義的上下文管理器with MyContextManager() as manager:    # 在這個代碼塊中使用 manager 管理的資源    pass

2. 嵌套使用

上下文管理器可以進行嵌套使用,這樣可以方便地管理多個資源。上下文管理器的嵌套使用可以幫助我們方便地管理多個資源。這種嵌套使用可以確保資源的正確獲取和釋放,使代碼更加清晰和易于維護。這里有一個示例,演示了如何嵌套使用多個上下文管理器:H0X28資訊網——每日最新資訊28at.com

class DatabaseConnection:    def __enter__(self):        print('Opening database connection')        # 假設這里是連接數據庫的代碼        return self    def __exit__(self, exc_type, exc_value, traceback):        print('Closing database connection')        # 假設這里是關閉數據庫連接的代碼class FileOperation:    def __enter__(self):        print('Opening file')        # 假設這里是打開文件的代碼        return self    def __exit__(self, exc_type, exc_value, traceback):        print('Closing file')        # 假設這里是關閉文件的代碼# 嵌套使用上下文管理器with DatabaseConnection() as db_connection:    with FileOperation() as file:        # 執行需要同時使用數據庫連接和文件的操作        pass

H0X28資訊網——每日最新資訊28at.com

在這個示例中,我們嵌套使用了 `DatabaseConnection` 和 `FileOperation` 兩個上下文管理器,這樣可以確保在操作完成后,數據庫連接和文件都能被正確地關閉。H0X28資訊網——每日最新資訊28at.com

嵌套使用上下文管理器使得我們能夠更加靈活地管理多個資源,確保資源的獲取和釋放都能得到正確處理。這種方式使得代碼的可讀性更強,同時也降低了出錯的可能性。H0X28資訊網——每日最新資訊28at.com

希望這個示例能夠幫助您更好地理解上下文管理器的嵌套使用。H0X28資訊網——每日最新資訊28at.com

三、上下文管理器的應用

H0X28資訊網——每日最新資訊28at.com

1. 文件操作

使用 with 語句管理文件資源H0X28資訊網——每日最新資訊28at.com

with open('example.txt', 'r') as f:    for line in f:        print(line)# 文件在 with 代碼塊結束后自動關閉

H0X28資訊網——每日最新資訊28at.com

2. 線程鎖

H0X28資訊網——每日最新資訊28at.com

import threadinglock = threading.Lock()with lock:    # 執行需要進行線程同步的操作    pass# 線程鎖在 with 代碼塊結束后自動釋放

3. 數據庫連接

import pymysqlclass DBConnection:    def __enter__(self):        self.conn = pymysql.connect(host='localhost', user='user', password='password', db='test_db')        self.cursor = self.conn.cursor()        return self.cursor    def __exit__(self, exc_type, exc_value, traceback):        self.cursor.close()        self.conn.close()with DBConnection() as cursor:    cursor.execute('SELECT * FROM example_table')    # 執行數據庫操作# 數據庫連接在 with 代碼塊結束后自動關閉

4. 異常處理

我們還沒有談到 __exit__ 方法的這三個參數:type,value 和 traceback。 在第4步和第6步之間,如果發生異常,Python 會將異常的 type,value 和 traceback 傳遞給 __exit__ 方法。 它讓 __exit__ 方法來決定如何關閉文件以及是否需要其他步驟。在我們的案例中,我們并沒有注意它們。H0X28資訊網——每日最新資訊28at.com

那如果我們的文件對象拋出一個異常呢?萬一我們嘗試訪問文件對象的一個不支持的方法。舉個例子:H0X28資訊網——每日最新資訊28at.com

with File('demo.txt', 'w') as opened_file:    opened_file.undefined_function('Hola!')

我們來列一下,當異常發生時,with 語句會采取哪些步驟:H0X28資訊網——每日最新資訊28at.com

  • 它把異常的 type,value 和 traceback 傳遞給 __exit__方法。
  • 它讓 __exit__ 方法來處理異常。
  • 如果 __exit__ 返回的是 True,那么這個異常就被優雅地處理了。
  • 如果 __exit__ 返回的是 True 以外的任何東西,那么這個異常將被 with 語句拋出。

在我們的案例中,__exit__ 方法返回的是 None (如果沒有 return 語句那么方法會返回 None)。因此,with 語句拋出了那個異常。H0X28資訊網——每日最新資訊28at.com

Traceback (most recent call last):File "<stdin>", line 2, in <module>AttributeError: 'file' object has no attribute 'undefined_function'

H0X28資訊網——每日最新資訊28at.com

我們嘗試下在 exit 方法中處理異常:H0X28資訊網——每日最新資訊28at.com

class File(object):    def __init__(self, file_name, method):        self.file_obj = open(file_name, method)    def __enter__(self):        return self.file_obj    def __exit__(self, type, value, traceback):        print("Exception has been handled")        self.file_obj.close()        return Truewith File('demo.txt', 'w') as opened_file:    opened_file.undefined_function()# Output: Exception has been handled

H0X28資訊網——每日最新資訊28at.com

我們的 `__exit__` 方法返回了 `True`,因此沒有異常會被 `with` 語句拋出。H0X28資訊網——每日最新資訊28at.com

這還不是實現上下文管理器的唯一方式。還有一種方式,我們會在下一節中一起看看。H0X28資訊網——每日最新資訊28at.com

H0X28資訊網——每日最新資訊28at.com

上下文管理器在異常處理方面也非常有用,當 with 代碼塊中出現異常時,上下文管理器的 __exit__ 方法會被調用,這樣我們可以在 exit 方法中處理異常并進行資源的釋放和清理。H0X28資訊網——每日最新資訊28at.com

class MyContextManager:    def __enter__(self):        print('Entering the context')        return self    def __exit__(self, exc_type, exc_value, traceback):        print('Exiting the context')        if exc_type is not None:            print(f'An error occurred: {exc_value}')        # 在退出上下文時進行清理工作# 使用自定義的上下文管理器處理異常with MyContextManager() as manager:    # 在這個代碼塊中可能會出現異常    raise ValueError('Something went wrong')

H0X28資訊網——每日最新資訊28at.com

總結

上下文管理器作為 Python 中極為重要的概念之一,為資源管理和異常處理提供了一種優雅而可靠的解決方案。通過定義自己的上下文管理器,我們可以輕松地擴展其應用范圍,實現更多自定義的資源管理和清理邏輯。同時,上下文管理器的嵌套使用可以幫助我們更好地處理多個資源的管理,使得代碼的結構更加清晰和可維護。H0X28資訊網——每日最新資訊28at.com

通過本文的學習,讀者可以更深入地理解上下文管理器的原理和用法,為編寫更加健壯和可靠的 Python 代碼打下堅實的基礎。希望讀者能夠充分利用上下文管理器這一強大工具,提高自己的編程效率和代碼質量。H0X28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-41718-0.htmlPython上下文管理,你真的了解嗎?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 數據加密難做?試試這個庫

下一篇: 八個大幅提升開發效率的VS Code插件

標簽:
  • 熱門焦點
  • Find N3入網:最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經正式入網,型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標系統提供非預期的輸入并監視異常結果來發現軟件漏洞的方法。可以用來發現應用程序、操作系統和網絡協議等中的漏洞或
  • 微軟邀請 Microsoft 365 商業用戶,測試視頻編輯器 Clipchamp

    8 月 1 日消息,微軟近日宣布即將面向 Microsoft 365 商業用戶,開放 Clipchamp 應用,邀請用戶通過該應用來編輯視頻。微軟于 2021 年收購 Clipchamp,隨后開始逐步整合到 Microsof
  • 阿里大調整

    來源:產品劉有媒體報道稱,近期淘寶天貓集團啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項,目前已形成一個初步的&ldquo;征求意見版&rdquo;:1、取消P序列
  • 華為發布HarmonyOS 4:更好玩、更流暢、更安全

    在8月4日的華為開發者大會2023(HDC.Together)大會上,HarmonyOS 4正式發布。自2019年發布以來,HarmonyOS一直以用戶為中心,經歷四年多的發展HarmonyOS已
  • 華為HarmonyOS 4.0將于8月4日發布 或搭載AI大模型技術

    華為宣布HarmonyOS4.0將于8月4日正式發布。此前,華為已經針對開發者公布了HarmonyOS4.0,以便于開發者提前進行適配,也因此被曝光出了一些新系統的特性
  • 2299元起!iQOO Pad明晚首銷:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發布會,除了首發安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發布會上推出了旗下首款平板電腦——iQOO Pad,其最大的賣點
  • Counterpoint :OPPO雙旗艦戰略全面落地 高端產品銷量增長22%

    2023年6月30日,全球行業分析機構Counterpoint Research發布的《中國智能手機高端市場白皮書》顯示,中國智能手機品牌正在尋求高質量發展,中國高端智能
  • 蘋果MacBook Pro 2021測試:仍不支持平滑滾動

    據10月30日9to5 Mac 消息報道,蘋果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后獲得了不錯的評價,亮點包括行業領先的性能,令人印象深刻的電池續航,精美豐
Top 主站蜘蛛池模板: 枝江市| 社会| 吐鲁番市| 和平区| 叶城县| 宁安市| 望都县| 莒南县| 武陟县| 陈巴尔虎旗| 合阳县| 潢川县| 琼中| 郑州市| 乳源| 新安县| 昔阳县| 清丰县| 冷水江市| 旌德县| 田东县| 偏关县| 无极县| 改则县| 乡宁县| 赤城县| 西吉县| 铜陵市| 于都县| 潼南县| 和平县| 贵定县| 麟游县| 永善县| 雷山县| 如皋市| 呼和浩特市| 仪陇县| 台州市| 和平区| 明溪县|