Python 簡單理解 with 上下文管理器
with上下文管理器,這個用過很多次,比如在執行mysql語句的時候要先連結資料庫,獲取遊標,執行sql語句,關閉連線。又或者是文字內容的讀寫,開啟文字寫入內容關閉文字。
如果每次執行一條語句都要做這麼多操作,就會產生大量重複的程式碼,這個時候使用上下文管理器即可美觀又輕鬆的解決這個問題。
with管理上下文的作用是對一些重複的程式碼簡單化,並且能最佳化try/except/finally的寫法。
上下文的實現是透過兩個魔法函式enter和exit實現,後來更新再造後,使用contextlib提供的API可以更加方便的完成。
概念和功能都明白後,最重要的還是如何實現。
舉個例子:浪子去買貓餅乾,每次買的時候都要做這些動作,掏出錢包,花出x元,收回錢包。每次都要重複掏錢包收錢包這個動作有些麻煩,並且萬一忘了掏錢包就不能付錢,忘了收錢包的話,錢包就掉了。每次掏錢包收錢包都要寫程式碼,有啥簡介的方式嘛?
使用enter和exit實現(1)
class
wallet(object)
:
def
__init__
(self,man)
:
self.man=man
def
__enter__
(self)
:
print(self.man +
'放心大膽的掏出了錢包'
)
def
__exit__
(self, exc_type, exc_val, exc_tb)
:
print(self.man +
'小心翼翼的收起來錢包'
)
def
use_money
(man)
:
return
wallet(man)
with
use_money(
'langzi'
)
as
a:
print(
'花了600塊錢'
)
返回結果:
langzi放心大膽的掏出了錢包
花了
600
塊錢
langzi小心翼翼的收起來錢包
使用enter和exit實現(2)
當然也可以這麼寫:
class
wallet(object)
:
def
__init__
(self,man)
:
self.man=man
def
__enter__
(self)
:
print(self.man +
'放心大膽的掏出了錢包'
)
return
self
# return self 這一步非常重要,作用是返回例項
def
__exit__
(self, exc_type, exc_val, exc_tb)
:
print(self.man +
'小心翼翼的收起來錢包'
)
def
use_money
(self,money)
:
print(self.man +
'花了'
+ money +
'元'
)
with
wallet(
'浪子'
)
as
a:
a.use_money(
'600'
)
執行結果:
浪子放心大膽的掏出了錢包
浪子花了
600
元
浪子小心翼翼的收起來錢包
使用contextlib實現
import
contextlib
@contextlib.contextmanager
def
use_money
(man)
:
try
:
print(man +
'十分放心大膽的掏出錢包'
)
yield
None
# yield生成器,執行到這裡會返回一個值(你隨便寫一個就行)
finally
:
print(man +
'萬分謹慎的收起了錢包'
)
with
use_money(
'langzi'
)
as
a:
print(
'花了1塊錢'
)
返回結果:
langzi十分放心大膽的掏出錢包
花了
1
塊錢
langzi萬分謹慎的收起了錢包
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31560357/viewspace-2641463/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python分享之上下文管理器Python
- Python深入02 上下文管理器Python
- Python - Context Manager 上下文管理器PythonContext
- 完全理解關鍵字”with”與上下文管理器
- python上下文管理器closing的應用Python
- 什麼是Python中Context上下文管理器PythonContext
- Python上下文管理器你學會了嗎?Python
- 《Python有什麼好學的》之上下文管理器Python
- Python 的上下文管理器是怎麼設計的?Python
- Pyhton提高:with上下文管理器
- 簡單理解promisePromise
- EJB簡單理解
- Restful簡單理解REST
- BFC簡單理解
- Python學習之路33-上下文管理器和else塊Python
- python中的__name__=='__main__'如何簡單理解PythonAI
- 上下文管理器和 else 塊
- 上下文管理器與 with 語句
- 上下文繪圖,濾鏡簡單使用繪圖
- 簡單理解OAuth 2.0OAuth
- ThreadLocal的簡單理解thread
- Java的簡單理解(2)Java
- PHP socket 的簡單理解PHP
- 簡單理解flex佈局Flex
- MongoDB索引的簡單理解MongoDB索引
- 快速排序的簡單理解排序
- node.js簡單理解Node.js
- 對CSRF的簡單理解
- 簡單好用的檔案管理器:zCommander for MacMac
- 簡單理解DNS解析流程(一)DNS
- 關於BFC的簡單理解
- Object.keys()的簡單理解Object
- 簡單理解同步與非同步非同步
- vue cli 3的簡單理解Vue
- 簡單的理解 Object.defineProperty()Object
- 氣泡排序的簡單理解排序
- 選擇排序的簡單理解排序
- 歸併排序的簡單理解排序