欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

舉兩個例子:

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

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

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

上下文管理器怎么使用?

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

實例:文件操作

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)閉文件,對于上下文管理器而言,有隸屬于它的程序塊,當隸屬于它的程序塊執(zhí)行結(jié)束的時候(判斷縮進),上下文管理器將自動關(guān)閉文件。
 上述實例,也可以使用try...except...來實現(xiàn),同樣可以很直觀的看到使用with...as...語句之后,代碼確實相對更加簡潔。

上下文管理實現(xiàn)機制

因為文件對象是Python的內(nèi)置對象,內(nèi)置了上下文管理的特殊方法,所以它可以使用with語句。在Python中,任何對象,只要實現(xiàn)了上下文管理,就可以使用with語句,實現(xiàn)上下文管理需要通過__enter__和__exit__這兩個方法來實現(xiàn)。

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

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

with 上下文管理器:
    語法體

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

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

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

class Context(object):

  def __init__(self):
    print "實例化一個對象"

  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í)行,簡化了上下文管理器的實現(xiàn)方式:

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

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

相關(guān)文章

  • Python 發(fā)送SMTP郵件的簡單教程

    Python 發(fā)送SMTP郵件的簡單教程

    SMTP(Simple Mail Transfer Protocol)簡單郵件傳輸協(xié)議,Python內(nèi)置對SMTP的支持,可以發(fā)送純文本文件,HTML郵件以及附帶文件。本文講解如何使用python發(fā)送郵件
    2021-06-06
  • 詳解Python 解壓縮文件

    詳解Python 解壓縮文件

    這篇文章主要介紹了Python 解壓縮文件,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • Pytorch如何加載部分權(quán)重

    Pytorch如何加載部分權(quán)重

    這篇文章主要介紹了Pytorch如何加載部分權(quán)重問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python利器openpyxl之操作excel表格

    Python利器openpyxl之操作excel表格

    這篇文章主要給大家介紹了關(guān)于Python利器openpyxl之操作excel表格的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • Python數(shù)據(jù)可視化實現(xiàn)正態(tài)分布(高斯分布)

    Python數(shù)據(jù)可視化實現(xiàn)正態(tài)分布(高斯分布)

    這篇文章主要介紹了Python數(shù)據(jù)可視化實現(xiàn)正態(tài)分布(高斯分布),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • Python使用Flask Migrate模塊遷移數(shù)據(jù)庫

    Python使用Flask Migrate模塊遷移數(shù)據(jù)庫

    Flask-Migrate是一個為Flask應(yīng)用處理SQLAlchemy數(shù)據(jù)庫遷移的擴展,使得可以通過Flask的命令行接口或者Flask-Scripts對數(shù)據(jù)庫進行操作
    2022-07-07
  • django實現(xiàn)悲觀鎖樂觀鎖的項目實踐

    django實現(xiàn)悲觀鎖樂觀鎖的項目實踐

    在Django中,我們可以通過實現(xiàn)悲觀鎖和樂觀鎖來保證數(shù)據(jù)的安全性,本文就來介紹一下django實現(xiàn)悲觀鎖樂觀鎖的項目實踐,感興趣的可以了解一下
    2023-08-08
  • python誤差棒圖errorbar()函數(shù)實例解析

    python誤差棒圖errorbar()函數(shù)實例解析

    這篇文章主要介紹了python誤差棒圖errorbar()函數(shù)實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Python+matplotlib實現(xiàn)簡單曲線的繪制

    Python+matplotlib實現(xiàn)簡單曲線的繪制

    Matplotlib是Python的繪圖庫,它能讓使用者很輕松地將數(shù)據(jù)圖形化,并且提供多樣化的輸出格式。本文將利用matplotlib繪制簡單的曲線圖,感興趣的朋友可以學習一下
    2022-04-04
  • Django框架中表單的用法

    Django框架中表單的用法

    這篇文章介紹了Django框架中表單的用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06

最新評論