精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

開發(fā) 前端
本文將深入探討 Python 中的上下文管理器,介紹其概念、用法和實(shí)際應(yīng)用,并提供豐富的代碼示例,幫助讀者更好地理解和運(yùn)用這一強(qiáng)大的特性。

在 Python 編程中,有效地管理資源和處理異常是至關(guān)重要的。上下文管理器作為一種強(qiáng)大的工具,提供了一種優(yōu)雅的方式來管理資源,確保它們在使用完畢后能夠被正確釋放。通過結(jié)合 with 語句,上下文管理器使得資源的獲取和釋放變得簡單而可靠,同時也使得異常處理變得更加優(yōu)雅和簡潔。本文將深入探討 Python 中的上下文管理器,介紹其概念、用法和實(shí)際應(yīng)用,并提供豐富的代碼示例,幫助讀者更好地理解和運(yùn)用這一強(qiáng)大的特性。

當(dāng)談?wù)?Python 中的上下文管理時,我們通常是指 with 語句和上下文管理器。上下文管理器可以讓我們更方便地管理資源,比如文件、網(wǎng)絡(luò)連接或者數(shù)據(jù)庫連接,同時也可以確保資源在使用完畢后得到正確的清理和釋放。在本文中,我將詳細(xì)介紹上下文管理器的概念、用法和實(shí)例,并提供豐富的代碼示例。

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

在 Python 中,上下文管理器是指實(shí)現(xiàn)了 __enter__ 和 __exit__ 方法的對象。當(dāng)我們使用 with 語句時,會調(diào)用上下文管理器的 __enter__ 方法獲取資源,然后在 with 代碼塊執(zhí)行結(jié)束后,無論是正常結(jié)束還是出現(xiàn)異常,都會調(diào)用 __exit__ 方法來進(jìn)行清理和釋放資源。

上下文管理器可以用于許多場景,比如文件操作、線程鎖、數(shù)據(jù)庫連接等,它們能夠確保資源的正確管理和釋放,避免出現(xiàn)資源泄漏等問題。

一個上下文管理器的類,最起碼要定義 __enter__ 和 exit 方法。 讓我們來構(gòu)造我們自己的開啟文件的上下文管理器,并學(xué)習(xí)下基礎(chǔ)知識。

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()

通過定義 __enter__ 和 __exit__ 方法,我們可以在with語句里使用它。我們來試試:

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

我們的 __exit__ 函數(shù)接受三個參數(shù)。這些參數(shù)對于每個上下文管理器類中的 __exit__ 方法都是必須的。我們來談?wù)勗诘讓佣及l(fā)生了什么。

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

二、實(shí)現(xiàn)上下文管理器

我們也可以自定義上下文管理器,只需實(shí)現(xiàn) __enter__ 和 __exit__ 方法即可。

  1. 基礎(chǔ)實(shí)現(xiàn)
python復(fù)制代碼class MyContextManager:
    def __enter__(self):
        print('Entering the context')
        # 返回需要被管理的資源
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print('Exiting the context')
        # 在退出上下文時進(jìn)行清理工作

# 使用自定義的上下文管理器
with MyContextManager() as manager:
    # 在這個代碼塊中使用 manager 管理的資源
    pass

2. 嵌套使用

上下文管理器可以進(jìn)行嵌套使用,這樣可以方便地管理多個資源。上下文管理器的嵌套使用可以幫助我們方便地管理多個資源。這種嵌套使用可以確保資源的正確獲取和釋放,使代碼更加清晰和易于維護(hù)。這里有一個示例,演示了如何嵌套使用多個上下文管理器:

class DatabaseConnection:
    def __enter__(self):
        print('Opening database connection')
        # 假設(shè)這里是連接數(shù)據(jù)庫的代碼
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print('Closing database connection')
        # 假設(shè)這里是關(guān)閉數(shù)據(jù)庫連接的代碼

class FileOperation:
    def __enter__(self):
        print('Opening file')
        # 假設(shè)這里是打開文件的代碼
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print('Closing file')
        # 假設(shè)這里是關(guān)閉文件的代碼

# 嵌套使用上下文管理器
with DatabaseConnection() as db_connection:
    with FileOperation() as file:
        # 執(zhí)行需要同時使用數(shù)據(jù)庫連接和文件的操作
        pass

在這個示例中,我們嵌套使用了 `DatabaseConnection` 和 `FileOperation` 兩個上下文管理器,這樣可以確保在操作完成后,數(shù)據(jù)庫連接和文件都能被正確地關(guān)閉。

嵌套使用上下文管理器使得我們能夠更加靈活地管理多個資源,確保資源的獲取和釋放都能得到正確處理。這種方式使得代碼的可讀性更強(qiáng),同時也降低了出錯的可能性。

希望這個示例能夠幫助您更好地理解上下文管理器的嵌套使用。

三、上下文管理器的應(yīng)用

1. 文件操作

使用 with 語句管理文件資源

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

2. 線程鎖

import threading

lock = threading.Lock()
with lock:
    # 執(zhí)行需要進(jìn)行線程同步的操作
    pass
# 線程鎖在 with 代碼塊結(jié)束后自動釋放

3. 數(shù)據(jù)庫連接

import pymysql

class 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')
    # 執(zhí)行數(shù)據(jù)庫操作
# 數(shù)據(jù)庫連接在 with 代碼塊結(jié)束后自動關(guān)閉

4. 異常處理

我們還沒有談到 __exit__ 方法的這三個參數(shù):type,value 和 traceback。 在第4步和第6步之間,如果發(fā)生異常,Python 會將異常的 type,value 和 traceback 傳遞給 __exit__ 方法。 它讓 __exit__ 方法來決定如何關(guān)閉文件以及是否需要其他步驟。在我們的案例中,我們并沒有注意它們。

那如果我們的文件對象拋出一個異常呢?萬一我們嘗試訪問文件對象的一個不支持的方法。舉個例子:

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

我們來列一下,當(dāng)異常發(fā)生時,with 語句會采取哪些步驟:

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

在我們的案例中,__exit__ 方法返回的是 None (如果沒有 return 語句那么方法會返回 None)。因此,with 語句拋出了那個異常。

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

我們嘗試下在 exit 方法中處理異常:

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 True

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

# Output: Exception has been handled

我們的 `__exit__` 方法返回了 `True`,因此沒有異常會被 `with` 語句拋出。

這還不是實(shí)現(xiàn)上下文管理器的唯一方式。還有一種方式,我們會在下一節(jié)中一起看看。

上下文管理器在異常處理方面也非常有用,當(dāng) with 代碼塊中出現(xiàn)異常時,上下文管理器的 __exit__ 方法會被調(diào)用,這樣我們可以在 exit 方法中處理異常并進(jìn)行資源的釋放和清理。

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}')
        # 在退出上下文時進(jìn)行清理工作

# 使用自定義的上下文管理器處理異常
with MyContextManager() as manager:
    # 在這個代碼塊中可能會出現(xiàn)異常
    raise ValueError('Something went wrong')

總結(jié)

上下文管理器作為 Python 中極為重要的概念之一,為資源管理和異常處理提供了一種優(yōu)雅而可靠的解決方案。通過定義自己的上下文管理器,我們可以輕松地擴(kuò)展其應(yīng)用范圍,實(shí)現(xiàn)更多自定義的資源管理和清理邏輯。同時,上下文管理器的嵌套使用可以幫助我們更好地處理多個資源的管理,使得代碼的結(jié)構(gòu)更加清晰和可維護(hù)。

通過本文的學(xué)習(xí),讀者可以更深入地理解上下文管理器的原理和用法,為編寫更加健壯和可靠的 Python 代碼打下堅實(shí)的基礎(chǔ)。希望讀者能夠充分利用上下文管理器這一強(qiáng)大工具,提高自己的編程效率和代碼質(zhì)量。

責(zé)任編輯:趙寧寧 來源: python學(xué)習(xí)之旅
相關(guān)推薦

2025-06-06 08:00:00

上下文管理器Python開發(fā)

2025-08-28 06:05:00

2025-05-20 02:11:00

2024-09-30 14:10:00

2014-04-04 10:27:00

Python上下文管理器

2017-05-11 14:00:02

Flask請求上下文應(yīng)用上下文

2014-04-17 16:42:03

DevOps

2022-07-26 00:00:22

HTAP系統(tǒng)數(shù)據(jù)庫

2012-12-31 10:01:34

SELinuxSELinux安全

2022-09-14 13:13:51

JavaScript上下文

2021-11-09 09:48:13

Logging python模塊

2021-01-15 07:44:21

SQL注入攻擊黑客

2023-03-16 10:49:55

2014-11-28 10:31:07

Hybrid APP

2020-02-27 10:49:26

HTTPS網(wǎng)絡(luò)協(xié)議TCP

2019-09-16 08:40:42

2024-11-14 09:00:00

Python上下文管理器

2022-09-15 08:01:14

繼承基礎(chǔ)設(shè)施基礎(chǔ)服務(wù)

2023-05-05 07:41:42

執(zhí)行上下文JavaScript

2022-11-03 08:29:32

編程管理器協(xié)議
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

色吧影院999| 欧美日韩中文字幕综合视频| 亚洲在线观看视频| 精品久久免费视频| 欧美日韩激情| 日韩午夜三级在线| 国产精品沙发午睡系列| 国产精品99999| 国产传媒久久文化传媒| 69视频在线免费观看| 国产一二三四区在线| 6080亚洲理论片在线观看| 欧美性xxxx极品高清hd直播| 亚洲第一综合| 秋霞欧美在线观看| 久久99国产精品久久| 国语自产在线不卡| 成人无码精品1区2区3区免费看| 一区二区三区视频播放| 在线精品观看国产| 国产主播自拍av| 麻豆网站在线看| 久久久噜噜噜久久中文字幕色伊伊 | 久久性爱视频网站| 成人1区2区| 欧美日韩精品国产| 四虎永久免费网站| 第一页在线观看| 99九九99九九九视频精品| 成人黄在线观看| 无码人妻精品一区二区三区蜜桃91| 在线观看国产精品入口| 一区二区三区精品99久久| 一级特黄a大片免费| 麻豆国产精品| 欧美另类变人与禽xxxxx| 丝袜老师办公室里做好紧好爽| 婷婷av在线| 亚洲手机成人高清视频| 日韩hmxxxx| 免费国产在线观看| 99re免费视频精品全部| 97人人干人人| 国产偷拍一区二区| 精品在线观看视频| 国产欧美日韩丝袜精品一区| 天堂网一区二区| 久久久久久黄| 日本国产一区二区三区| 日本一级片免费看| 日韩一级大片| 欧美亚洲日本网站| 中文字幕一区在线播放| 午夜一区在线| 日韩美女在线播放| 国产一区二区视频网站| 米奇777在线欧美播放| 欧美亚洲伦理www| 一级成人黄色片| 亚洲免费综合| 欧洲s码亚洲m码精品一区| 日韩免费视频一区二区视频在线观看| 国内在线观看一区二区三区| 欧美激情精品久久久久久久变态| 欧美精品一区二区蜜桃| 亚洲精品1234| 97婷婷大伊香蕉精品视频| 久热这里只有精品6| 亚洲中字黄色| 国产成人av在线播放| 最近中文字幕免费观看| 久久99九九99精品| 99www免费人成精品| 丁香花免费高清完整在线播放| 国产成人精品在线看| 精品欧美国产一区二区三区不卡| 深夜福利在线看| 国产欧美精品在线观看| 四虎免费在线观看视频| 国产黄色大片在线观看| 色综合天天综合| 午夜免费福利在线| 视频精品一区| 亚洲精品一区二区久| 无码少妇一区二区| 91久久高清国语自产拍| 欧美激情2020午夜免费观看| 久久久午夜影院| 奇米精品一区二区三区四区| 亚洲伊人久久大香线蕉av| 人妻精品一区一区三区蜜桃91| 久久久欧美精品sm网站| 国产一二三四五| 日本乱码一区二区三区不卡| 欧美日韩免费在线视频| 丰满饥渴老女人hd| 少妇一区二区视频| 免费不卡欧美自拍视频| 欧美精品亚洲精品日韩精品| 蜜桃视频第一区免费观看| 亚洲综合国产精品| 黄色片在线免费看| 亚洲黄色性网站| 成人3d动漫一区二区三区| 欧美成年网站| 亚洲视屏在线播放| 久草精品视频在线观看| 久久精品国产999大香线蕉| 国语精品免费视频| 超碰在线免费公开| 色素色在线综合| 精品国产乱码久久久久夜深人妻| 欧美色爱综合| 97精品在线视频| 国内精品久久久久久久久久久| 久久精品人人做人人综合 | 中文字幕中文字幕在线十八区 | 国产人妖在线播放| 久久精品一区八戒影视| 国产欧美日韩网站| 久久av网站| 中文字幕亚洲综合久久筱田步美| 国产污视频在线看| 国产乱码一区二区三区| 亚洲精品免费在线看| 香蕉伊大人中文在线观看| 日韩欧美国产高清| 日韩一级片av| 九九精品视频在线看| 日本一区视频在线| 欧美极品videos大乳护士| 精品国产乱码久久久久久免费| 精品在线观看一区| 免费黄网站欧美| 日韩欧美视频一区二区三区四区 | 国产精品久久久久久久久借妻| 污污网站免费在线观看| 亚洲一区二区在线视频| 一个人看的视频www| 五月婷婷六月综合| 成人福利网站在线观看11| 高清在线观看av| 91久久精品国产91性色tv| aa一级黄色片| 欧美中文日韩| 欧美亚洲爱爱另类综合| 校园春色亚洲| 亚洲免费av网址| 久久精品视频7| 久久久精品2019中文字幕之3| 久久婷婷五月综合色国产香蕉| 六月丁香久久丫| 97成人精品视频在线观看| 国精品人妻无码一区二区三区喝尿 | 二区三区不卡| 国产视频精品自拍| www.com国产| 久久精品视频免费| 天天干在线影院| 天天插综合网| 97se在线视频| 国产乱妇乱子在线播视频播放网站| 精品电影一区二区| 999这里只有精品| 久久久久国产精品麻豆ai换脸 | 国产精品一区二区久久不卡 | 欧美乱妇20p| 久草资源在线视频| 不卡的av网站| 日本一极黄色片| 国产电影一区二区在线观看| 不卡视频一区| 欧美日韩国产观看视频| 一本一道久久a久久精品逆3p| 中文字幕第三页| 依依成人精品视频| 亚洲国产精品成人综合久久久| 久久久999| 亚洲免费视频播放| 精品综合久久88少妇激情| 国产精品激情av电影在线观看| 97在线观看免费观看高清 | 在线一区二区观看| 三级av在线免费观看| 国产丶欧美丶日本不卡视频| 黄色动漫在线免费看| 日韩系列欧美系列| 成人欧美一区二区三区视频| 免费成人直播| 精品中文字幕在线2019| 免费国产在线观看| 欧美一级二级三级蜜桃| 国产情侣自拍av| 国产精品美女视频| 欧美一级片黄色| 美女免费视频一区二区| 亚洲 自拍 另类小说综合图区| 欧美肉体xxxx裸体137大胆| 91黄在线观看| 国产第一精品| 97视频在线观看视频免费视频| 男人资源在线播放| 精品视频一区在线视频| 国产视频一二三四区| 欧美性生交大片免费| 欧美黄色一区二区三区| 国产亚洲成av人在线观看导航| 少妇极品熟妇人妻无码| 蜜臀av一区二区| 69堂免费视频| 国产精品chinese| 一区二区三区四区视频在线观看| 四虎影视精品| 成人女人免费毛片| 精品一区91| 国产精品久久久久福利| 成人免费图片免费观看| 欧美成在线视频| 国产二区视频在线观看| 亚洲精品久久久久久久久久久久 | 成人h在线观看| 68精品久久久久久欧美 | 亚洲一区二区三区视频在线播放| 免费在线观看a视频| 久久综合99re88久久爱| www.啪啪.com| 国产精品99久久久久久宅男| 日日噜噜噜噜久久久精品毛片| 欧美亚洲三区| 国产原创中文在线观看| 亚洲午夜视频| 丰满人妻一区二区三区53号| 欧美高清在线| 亚洲激情一区二区| 不卡av一区二区| 日本一区二区三区四区在线观看 | 国产69精品久久| 国产成人久久精品| 欧美国产大片| 国产成人精品久久二区二区91| 久久青草伊人| 1769国产精品| 亚洲欧美电影| 国产成人精品在线视频| 亚洲第一会所| 国产精品免费小视频| 亚洲日本在线观看视频| 国产精品看片资源| 另类一区二区| 91精品天堂| 凹凸成人在线| 久久国产精品99久久久久久丝袜| 欧美黄色影院| 蜜桃视频成人| 欧美色图一区| 中国老女人av| 很黄很黄激情成人| 国产精品久久中文字幕| 免费视频久久| 四季av一区二区| 国内精品视频666| 香蕉视频在线观看黄| 99久久综合色| www.av欧美| 中文字幕五月欧美| 18岁成人毛片| 精品国产91久久久久久| www.久久久久久久| 欧美日韩国产综合久久| 国产丝袜在线视频| 亚洲激情视频在线| 午夜影院免费体验区| 亚洲天堂免费在线| 国产福利视频在线| 91精品国产91久久| 国产精品久久亚洲不卡| 成人在线视频福利| 精品国产18久久久久久洗澡| 日本不卡一区二区三区视频| 天天综合精品| 啊啊啊一区二区| 久草这里只有精品视频| 国产精品无码自拍| 久久精品亚洲麻豆av一区二区| 天堂在线中文视频| 亚洲国产va精品久久久不卡综合 | 3751色影院一区二区三区| 蜜桃在线一区二区| 一本一本久久a久久精品牛牛影视| 国产视频在线播放| 人九九综合九九宗合| 亚洲热av色在线播放| 久久99精品久久久久久三级 | 国产精品嫩草影院精东| 日韩va亚洲va欧洲va国产| 日本不卡不卡| 欧日韩在线观看| 一区二区三区国产好| 亚洲午夜精品国产| 久久成人一区| 亚洲麻豆一区二区三区| 国产精品久久久久久一区二区三区| 九九九久久久久| 欧美三日本三级三级在线播放| 国模人体一区二区| 久久天天躁夜夜躁狠狠躁2022| 三级中文字幕在线观看| 91国产丝袜在线放| 9999国产精品| 日本免费不卡一区二区| 国产精品一区二区久久不卡| 久久精品三级视频| 狠狠操狠狠色综合网| 精品欧美一区二区精品少妇| 日日骚久久av| 粉嫩一区二区三区| 国产三级精品在线不卡| 中文字幕乱码亚洲无线精品一区| 天天干天天爽天天射| 国产亚洲一区字幕| 黄色在线观看国产| 精品久久久久久久久久久院品网| 看黄网站在线观看| 国产日韩欧美另类| 精品久久久久久久久久久下田| 妺妺窝人体色777777| 国产精品自拍毛片| 午夜国产小视频| 欧美三级日本三级少妇99| 国产大片在线免费观看| 日韩男女性生活视频| 丝袜久久网站| 男女av免费观看| 337p粉嫩大胆色噜噜噜噜亚洲| 日本亚洲色大成网站www久久| 日韩欧美色综合网站| h片在线观看网站| 川上优av一区二区线观看| 99精品视频在线观看播放| 亚洲欧美日韩一级| 亚洲国产成人在线| 国产一级片一区二区| 一区二区三区 在线观看视| 怡红院成人在线| 欧美aaaaa喷水| 日韩精品高清不卡| 国产破处视频在线观看| 欧美日韩一区中文字幕| 91这里只有精品| 成人淫片在线看| 午夜日韩在线| 女性生殖扒开酷刑vk| 亚洲国产精品麻豆| 五月激情六月婷婷| 日本高清+成人网在线观看| 精品久久不卡| 91 在线视频观看| 亚洲同性同志一二三专区| а√中文在线资源库| 午夜精品一区二区三区在线| 久久影院资源站| 最近免费中文字幕中文高清百度| 国产欧美日韩久久| 99久久婷婷国产一区二区三区| 欧美成年人视频| 91麻豆精品激情在线观看最新| 免费毛片网站在线观看| 久久久久久久久久久99999| 中国女人真人一级毛片| 精品国产自在精品国产浪潮| 亚洲精品一区二区三区在线| 免费成人午夜视频| 国产三级三级三级精品8ⅰ区| 136福利视频导航| 久久久久久久久久久av| 亚洲永久精品唐人导航网址| 爱情岛论坛亚洲首页入口章节| 最新高清无码专区| 欧美自拍偷拍一区二区| 日韩免费观看在线观看| 亚洲xxx拳头交| 性久久久久久久久久久| 欧美综合久久久| 三级资源在线| 欧美午夜精品久久久久免费视| 国产一区二区三区观看| 中文字幕视频网| 久久久精品一区| 午夜欧洲一区| 国产欧美精品一二三| 欧美日韩免费看| caoporn97在线视频| 蜜桃视频在线观看成人| 国产精品一区久久久久| www.五月婷婷.com| 久久久久久久久久久久av| 99久久精品费精品国产| 在线 丝袜 欧美 日韩 制服| 欧美一区二区视频在线观看 | 91香蕉视频在线下载|