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

Python with語句上下文管理器兩種實現(xiàn)方法分析

 更新時間:2018年02月09日 08:53:17   作者:蒼松  
這篇文章主要介紹了Python with語句上下文管理器兩種實現(xiàn)方法,結(jié)合實例形式較為詳細的分析了Python上下文管理器的相關(guān)概念、功能、使用方法及相關(guān)操作注意事項,需要的朋友可以參考下

本文實例講述了Python with語句上下文管理器。分享給大家供大家參考,具體如下:

在編程中會經(jīng)常碰到這種情況:有一個特殊的語句塊,在執(zhí)行這個語句塊之前需要先執(zhí)行一些準備動作;當語句塊執(zhí)行完成后,需要繼續(xù)執(zhí)行一些收尾動作。例如,文件讀寫后需要關(guān)閉,數(shù)據(jù)庫讀寫完畢需要關(guān)閉連接,資源的加鎖和解鎖等情況。

對于這種情況python提供了上下文管理器(Context Manager)的概念,可以通過上下文管理器來定義/控制代碼塊執(zhí)行前的準備動作,以及執(zhí)行后的收尾動作。

一、為何使用上下文管理器

1、不使用上下文管理器的情況

通過try...finally語句執(zhí)行異常處理和關(guān)閉句柄的動作。

logger = open("log.txt", "w")
try:
  logger.write('Hello ')
  logger.write('World')
finally:
  logger.close()
print logger.closed

2、使用上下文管理器

默認文件Python的內(nèi)置file類型是支持上下文管理協(xié)議的。
使用上下文管理器with使得依據(jù)精簡了很多。

with open("log.txt", "w") as logger:
  logger.write('Hello ')
  logger.write('World')
print logger.closed

二、實現(xiàn)上下文管理器實現(xiàn)上下文管理器有兩種方式實現(xiàn)。方法一:類實現(xiàn)__enter__和__exit__方法。方法二:contextlib模塊裝飾器和生成器實現(xiàn)。

下面我們通過兩種方法分別實現(xiàn)一個自定義的上下文管理器。

1、方法一:通過類實現(xiàn)__enter__和__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):
  self.file_obj.close()
with File('demo.txt', 'w') as opened_file:
 opened_file.write('Hola!')

實現(xiàn)__enter__和__exit__方法后,就能通過with語句進行上下文管理。

a、底層都發(fā)生了什么?

1、with語句先暫存了File類的__exit__方法,然后它調(diào)用File類的__enter__方法。
2、__enter__方法打開文件并返回給with語句,打開的文件句柄被傳遞給opened_file參數(shù)。
3、with語句調(diào)用之前暫存的__exit__方法,__exit__方法關(guān)閉了文件。

b、異常處理

關(guān)于異常處理,with語句會采取哪些步驟。

1. 它把異常的type,value和traceback傳遞給__exit__方法
2. 它讓__exit__方法來處理異常
3. 如果__exit__返回的是True,那么這個異常就被忽略。
4. 如果__exit__返回的是True以外的任何東西,那么這個異常將被with語句拋出。

異常拋出

#異常拋出,_exit__返回的是True以外的任何東西,那么這個異常將被with語句拋出
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()
  print "type:",type
  print "value:",value
  print "traceback:",traceback
with File('demo.txt', 'w') as opened_file:
 opened_file.undefined_function('Hola!')
#output================================================
# type: <type 'exceptions.AttributeError'>
# value: 'file' object has no attribute 'undefined_function'
# traceback: <traceback object at 0x000000000262D9C8>
#  opened_file.undefined_function('Hola!')
# AttributeError: 'file' object has no attribute 'undefined_function'

異常忽略:

#異常忽略,__exit__返回的是True,那么這個異常就被忽略。
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, exception_type, exception_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('Hola!')
# output==================================
# Exception has been handled

2、方法二:contextlib模塊裝飾器和生成器實現(xiàn)

這種方式實現(xiàn)更優(yōu)雅,我個人更喜歡這種方式。

yield之前的代碼由__enter__方法執(zhí)行,yield之后的代碼由__exit__方法執(zhí)行。本質(zhì)上還是__enter____exit__方法。

# coding:utf-8
import contextlib
@contextlib.contextmanager
def myopen(filename, mode):
 f = open(filename, mode)
 try:
  yield f.readlines()
 except Exception as e:
  print e
 finally:
  f.close()
if __name__ == '__main__':
 with myopen(r'c:\ip2.txt', 'r') as f:
  for line in f:
   print line

3、with語句上多個下文關(guān)聯(lián)

直接通過一個with語句打開多個上下文,即可同時使用多個上下文變量,而不必需嵌套使用with語句。

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, exception_type, exception_value, traceback):
  self.file_obj.close()
  return True
with File('demo.txt', 'w') as f1,File('demo.txt','w') as f2:
 print f1,f2
# Output============================# <open file 'demo.txt', mode 'w' at 0x000000000263D150> <open file 'demo.txt', mode 'w' at 0x000000000263D1E0>

更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進階經(jīng)典教程

希望本文所述對大家Python程序設計有所幫助。

相關(guān)文章

  • 基于Python的關(guān)鍵字監(jiān)控及告警

    基于Python的關(guān)鍵字監(jiān)控及告警

    這篇文章主要為大家詳細介紹了基于Python的關(guān)鍵字監(jiān)控及告警,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Python利用PySimpleGUI實現(xiàn)自制桌面翻譯神器

    Python利用PySimpleGUI實現(xiàn)自制桌面翻譯神器

    工作上經(jīng)常需要與外國友人郵件溝通,奈何工作電腦沒有安裝有道詞典一類的翻譯軟件,結(jié)合自己的需要,自己用PySimpleGUI擼一個桌面翻譯神器,感興趣的可以了解一下
    2022-09-09
  • python爬取微博評論的實例講解

    python爬取微博評論的實例講解

    在本篇文章里小編給大家整理的是一篇關(guān)于python爬取微博評論的實例講解,有興趣的朋友們可以學習下。
    2021-01-01
  • 使用Python的內(nèi)建模塊collections的教程

    使用Python的內(nèi)建模塊collections的教程

    這篇文章主要介紹了使用Python的內(nèi)建模塊collections的教程,示例代碼基于Python2.x版本,需要的朋友可以參考下
    2015-04-04
  • 檢測python爬蟲時是否代理ip偽裝成功的方法

    檢測python爬蟲時是否代理ip偽裝成功的方法

    這篇文章主要介紹了檢測python爬蟲時是否代理ip偽裝成功的方法以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。,需要的朋友可以參考下
    2019-07-07
  • python和go語言的區(qū)別是什么

    python和go語言的區(qū)別是什么

    在本篇文章中小編給大家整理的是一篇關(guān)于go語言和python的區(qū)別點,需要的朋友們可以學習下。
    2020-07-07
  • Python使用裝飾器模擬用戶登陸驗證功能示例

    Python使用裝飾器模擬用戶登陸驗證功能示例

    這篇文章主要介紹了Python使用裝飾器模擬用戶登陸驗證功能,結(jié)合登錄驗證實例形式分析了裝飾器的簡單使用技巧,需要的朋友可以參考下
    2018-08-08
  • Python中re模塊的常用方法總結(jié)

    Python中re模塊的常用方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于Python中re模塊的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • Flask使用SocketIO實現(xiàn)WebSocket與Vue進行實時推送

    Flask使用SocketIO實現(xiàn)WebSocket與Vue進行實時推送

    本文主要介紹了Flask使用SocketIO實現(xiàn)WebSocket與Vue進行實時推送,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • Python實現(xiàn)提取Word文檔中的文本和圖片

    Python實現(xiàn)提取Word文檔中的文本和圖片

    將內(nèi)容從?Word?文檔中提取出來可以方便我們對其進行其他操作,如將內(nèi)容儲存在數(shù)據(jù)庫中,本文將介紹如何使用簡單的代碼實現(xiàn)從?Word?文檔中提取文本和圖片內(nèi)容并保存,需要的可以參考下
    2023-12-12

最新評論

泰来县| 阿拉善盟| 南部县| 富民县| 河源市| 阿勒泰市| 阳城县| 定陶县| 抚远县| 遂昌县| 青海省| 通辽市| 香河县| 阜城县| 商河县| 通化县| 五河县| 政和县| 临邑县| 芦溪县| 双峰县| 武穴市| 措勤县| 修文县| 新郑市| 文水县| 喀什市| 沛县| 阳新县| 资中县| 波密县| 英德市| 太湖县| 二连浩特市| 兰溪市| 汽车| 濮阳县| 台州市| 永和县| 富民县| 洪泽县|