最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中的上下文管理器和with語句的使用

 更新時(shí)間:2018年04月17日 13:46:20   作者:Yabea  
本篇文章主要介紹了Python中的上下文管理器和with語句的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

Python2.5之后引入了上下文管理器(context manager),算是Python的黑魔法之一,它用于規(guī)定某個(gè)對象的使用范圍。本文是針對于該功能的思考總結(jié)。

為什么需要上下文管理器?

首先,需要思索下為什么需要引入上下文管理器。

在正常情況下,管理各種系統(tǒng)資源(如文件)、數(shù)據(jù)庫連接時(shí),通常是先打開這些資源,執(zhí)行完相應(yīng)的業(yè)務(wù)邏輯,最后關(guān)閉資源。

舉兩個(gè)例子:

1.使用Python打開一個(gè)文件寫入內(nèi)容,之后需要關(guān)閉這個(gè)文件。如果不正常關(guān)閉的話可能會在文件操作時(shí)出現(xiàn)異常,因?yàn)橄到y(tǒng)允許你打開的文件的最大數(shù)是有限的。

2.在數(shù)據(jù)庫連接時(shí)也是存在類似問題,數(shù)據(jù)庫的連接算是一種比較昂貴的資源,若連接過多而沒有及時(shí)關(guān)閉的話,就可能出現(xiàn)不能繼續(xù)連接的異常錯(cuò)誤。

但是,很多程序員經(jīng)常會忘記關(guān)閉文件,或者關(guān)閉數(shù)據(jù)庫的連接。這時(shí)候就引入了上下文管理器,它可以在你不需要該對象的時(shí)候,自動關(guān)閉它。

上下文管理器怎么使用?

上下文管理器的語法是:with...as...

實(shí)例:文件操作

print "不使用上下文管理器"
print "*" * 30
f = open('file.py', 'w')
print f.closed
f.write("# Hello World")
f.close()
print f.closed

print "\n使用上下文管理器"
print "*" * 30
with open("file.py", 'w') as f:
  print f.closed
  f.write('# Hello Python')
print f.closed

這里通過.closed比較,我們可以看到上下文管理器可以自動關(guān)閉文件,對于上下文管理器而言,有隸屬于它的程序塊,當(dāng)隸屬于它的程序塊執(zhí)行結(jié)束的時(shí)候(判斷縮進(jìn)),上下文管理器將自動關(guān)閉文件。
 上述實(shí)例,也可以使用try...except...來實(shí)現(xiàn),同樣可以很直觀的看到使用with...as...語句之后,代碼確實(shí)相對更加簡潔。

上下文管理實(shí)現(xiàn)機(jī)制

因?yàn)槲募ο笫荘ython的內(nèi)置對象,內(nèi)置了上下文管理的特殊方法,所以它可以使用with語句。在Python中,任何對象,只要實(shí)現(xiàn)了上下文管理,就可以使用with語句,實(shí)現(xiàn)上下文管理需要通過__enter__和__exit__這兩個(gè)方法來實(shí)現(xiàn)。

關(guān)于這兩個(gè)方法:

  1. enter(self):進(jìn)入該對象時(shí)調(diào)用此方法,返回值將放入with...as...語句中的as說明的變量中
  2. exit(self, type, value, tb):離開上下文管理器時(shí)調(diào)用該方法,如果有異常出現(xiàn),返回False,type、value和tb將分別表示異常的類型、值和追蹤信息,傳遞出上下文顯示;如果沒有異常,則三個(gè)變量的值均為None。

with 上下文管理器:
    語法體

當(dāng)with語句遇到上下文管理器時(shí),就會在執(zhí)行語法體之前,先執(zhí)行__enter__方法,然后再執(zhí)行語法體,執(zhí)行完語法體之后,執(zhí)行__exit__方法。

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

使用Python2.7X實(shí)現(xiàn)一個(gè)上下文管理器:

class Context(object):

  def __init__(self):
    print "實(shí)例化一個(gè)對象"

  def __enter__(self):
    print "獲取該對象"

  def __exit__(self, exc_type, exc_val, exc_tb):
    print "退出該對象"

temp = Context()

with temp:
  print "執(zhí)行體"

這樣,__enter__方法和__exit__方法的調(diào)用過程就很明晰。

contextLib

在contextlib中,提供了contextmanager裝飾器,通過yield返回函數(shù)將函數(shù)分隔為兩部分,yield之前的語句在__enter__中執(zhí)行,yield之后的語句在__exit__中執(zhí)行,簡化了上下文管理器的實(shí)現(xiàn)方式:

總結(jié):通過上下文管理器,我們可以更好的控制對象在不同區(qū)間的特性,并且可以使用with語句替代try...except方法,使得代碼更加的簡潔,主要的使用場景是訪問資源,可以保證不管過程中是否發(fā)生錯(cuò)誤或者異常都會執(zhí)行相應(yīng)的清理操作,釋放出訪問的資源。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python實(shí)現(xiàn)加密的方式總結(jié)

    python實(shí)現(xiàn)加密的方式總結(jié)

    這篇文章主要介紹了python實(shí)現(xiàn)加密的方式總結(jié),文中給大家提到了python中加密的注意點(diǎn),通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • django初始化數(shù)據(jù)庫的實(shí)例

    django初始化數(shù)據(jù)庫的實(shí)例

    今天小編就為大家分享一篇django初始化數(shù)據(jù)庫的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • python datetime 和時(shí)間戳互相轉(zhuǎn)換問題

    python datetime 和時(shí)間戳互相轉(zhuǎn)換問題

    time和datetime都是Python中的內(nèi)置模塊(不需要安裝,直接可以使用),都可以對時(shí)間進(jìn)行獲取,對時(shí)間格式進(jìn)行轉(zhuǎn)換,如時(shí)間戳和時(shí)間字符串的相互轉(zhuǎn)換,本文先給大家介紹python datetime 和時(shí)間戳互轉(zhuǎn)問題,感興趣的朋友一起看看吧
    2022-11-11
  • python開發(fā)利器之ulipad的使用實(shí)踐

    python開發(fā)利器之ulipad的使用實(shí)踐

    Ulipad是一個(gè)國人limodou編寫的專業(yè)Python編輯器,它基于wxpython開發(fā)的GUI(圖形化界面)。下面這篇文章主要介紹了python開發(fā)利器之ulipad的使用實(shí)踐,文中介紹的非常詳細(xì),對大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。
    2017-03-03
  • Python結(jié)合requests和Cheerio處理網(wǎng)頁內(nèi)容的操作步驟

    Python結(jié)合requests和Cheerio處理網(wǎng)頁內(nèi)容的操作步驟

    Python因其簡潔明了的語法和強(qiáng)大的庫支持,成為了編寫爬蟲程序的首選語言之一,requests庫是Python中用于發(fā)送HTTP請求的第三方庫,而Cheerio庫則是一個(gè)用于解析HTML和XML文檔的庫,本文給大家介紹了Python結(jié)合requests和Cheerio處理網(wǎng)頁內(nèi)容的操作步驟
    2025-01-01
  • python利用requests庫進(jìn)行接口測試的方法詳解

    python利用requests庫進(jìn)行接口測試的方法詳解

    在python的標(biāo)準(zhǔn)庫中,雖然提供了urllib,utllib2,httplib,但是做接口測試,requests真心好,正如官方說的,“讓HTTP服務(wù)人類”,一言以蔽之,說明一切,這篇文章主要給大家介紹了關(guān)于python利用requests庫進(jìn)行接口測試的相關(guān)資料,需要的朋友可以參考下
    2018-07-07
  • python 動態(tài)渲染 mysql 配置文件的示例

    python 動態(tài)渲染 mysql 配置文件的示例

    這篇文章主要介紹了python 動態(tài)渲染 mysql 配置文件的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-11-11
  • Python的數(shù)據(jù)結(jié)構(gòu)與算法的隊(duì)列詳解(3)

    Python的數(shù)據(jù)結(jié)構(gòu)與算法的隊(duì)列詳解(3)

    這篇文章主要為大家詳細(xì)介紹了Python的隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Python實(shí)現(xiàn)Excel表內(nèi)關(guān)鍵字查修改刪

    Python實(shí)現(xiàn)Excel表內(nèi)關(guān)鍵字查修改刪

    在日常辦公和數(shù)據(jù)處理中,Excel作為最常用的表格工具,承載著海量業(yè)務(wù)數(shù)據(jù),但對于有些場景也會力不從心,本文將使用Python開發(fā)一個(gè)Excel表內(nèi)關(guān)鍵字查修改刪工具,需要的可以參考下
    2025-04-04
  • python讀寫刪除復(fù)制文件操作方法詳細(xì)實(shí)例總結(jié)

    python讀寫刪除復(fù)制文件操作方法詳細(xì)實(shí)例總結(jié)

    這篇文章主要介紹了python讀寫刪除復(fù)制文件操作方法詳細(xì)實(shí)例總結(jié),需要的朋友可以參考下
    2021-04-04

最新評論

岑溪市| 白玉县| 富锦市| 平顺县| 湛江市| 河源市| 唐河县| 中卫市| 武功县| 平阳县| 深州市| 吐鲁番市| 常熟市| 鹤岗市| 泾川县| 汉阴县| 筠连县| 宝应县| 贞丰县| 武宁县| 曲麻莱县| 襄樊市| 巩留县| 招远市| 阿克| 始兴县| 广宗县| 桐柏县| 逊克县| 巴东县| 长岭县| 海盐县| 泌阳县| 大渡口区| 东光县| 明光市| 翁源县| 仁怀市| 治多县| 平利县| 安康市|