小帥b 學習python的正確姿式 python
with 語句能夠說是 Python 中 「人生苦短,我用 Python」 的經典表明之一,它可使得咱們在編寫代碼的時候很是簡短,且行之有效。ide
舉一個簡單的例子,在 Java 中,你想要讀取一個文件中的內容,通常來講須要本身定義一個這樣的讀取方法:學習
而在 Python 中,想要讀取文件就能夠直接這樣:對象
這樣看起來,是挺短呀。blog
其實文件操做中所涉及到的 try...except..finally 都給封裝起來了:資源
而咱們經過 with 拿了對象就能夠直接操做了,是否是有點強大,那麼它是怎麼作到的呢?get
with 語句是用於上下文對象的管理,經過它你就能夠操做上下文對象:it
好比上面這個,在 with 調用後獲得的 Handsomeb對象裏面,須要用到 enter () 和 exit() 這兩個方法,也就是說,若是你想要讓你建立的對象能被 with 使用,那麼你這個對象必需要有 enter () 和 exit() 這兩個方法。class
這兩個方法是幹什麼用的呢?變量
當咱們使用 with 去執行這個對象的時候,就會先去調用 enter () ,最後再調用 exit() :
打印出來是這樣的:
能夠看到,咱們使用 with 去調用 get_Handsomeb ,獲得的這個對象會先執行「進入 enter 方法」,接着再執行 with 裏面的 「get...」,等都執行完畢以後,再去執行 「進入 exit 方法」 。
咱們再來看看 with..後面緊跟着的 as 是幹嗎的呢?
在這裏的 as 後面的變量名稱,其實獲得的就是 enter 方法返回的值。
你看,我在 enter 方法中定義返回了 「handsomeb」 ,而後使用 「with .. as h」 的方式獲取對象, 從打印結果能夠看到:這時候 h 獲得的就是 enter 方法中的返回值 「handsomeb」 。
能夠返回一個對象:
接着,咱們再來看看咱們定義的這個 exit 方法,細心點你會發現,這裏攜帶了這麼幾個參數:type, value, trace。
它們是幹嗎的呢?這就是咱們開頭所說的問題。
咱們在操做一些對象的時候,好比操做文件的時候,可能會發現這樣那樣未知的異常,好比文件的位置找不到了,文件打不開了等等問題,關於這些異常的信息,咱們能夠在 exit 方法中獲得。
舉個例子:
咱們將type, value, trace這幾個參數都打印出來,而後建立一個計算的方法:
不過這個方法執行的是 100/0 ,咱們知道 0 是不能做爲除數的,這樣是會報錯的,咱們使用 with 來調用下看看:
執行結果是這樣的:
能夠看到,這些拋出的異常信息,咱們能夠在 exit 方法中的參數中直接獲取,那麼就能夠在這裏作一些事情(對一些異常進行處理)了,好比說,在文件操做中,咱們到最後都須要關閉這個文件流的,可是有了 exit 這個方法, Python 直接在裏面作了資源關閉操做,咱們就不須要再手動去關閉了。
ok,以上就是今天我給你分享的 with 工做方式,總結一下就是:
1.經過 with 語句能夠獲得一個上下文管理器
2.執行對象
3.加載 enter 方法
4.加載 exit 方法
5.執行 enter
6.as 能夠獲得 enter 的返回值
7.拿到對象執行相關操做
8.執行完了以後調用 exit 方法
9.若是遇到異常,exit 能夠獲取到異常信息
10.在 exit 中處理異常,返回 True
11.繼續執行 with 後面的語句。
但願對你有幫助,咱們下回見,peace!