python中with用法講解
我們都知道打開文件有兩種方法:
- f = open()
- with open() as f:
這兩種方法的區(qū)別就是第一種方法需要我們自己關(guān)閉文件;f.close(),而第二種方法不需要我們自己關(guān)閉文件,無(wú)論是否出現(xiàn)異常,with都會(huì)自動(dòng)幫助我們關(guān)閉文件,這是為什么呢?
我們先自定義一個(gè)類,用with來(lái)打開它:
class Foo():
def __enter__(self):
print("enter called")
def __exit__(self, exc_type, exc_val, exc_tb):
print("exit called")
print("exc_type :%s"%exc_type)
print("exc_val :%s"%exc_val)
print("exc_tb :%s"%exc_tb)
with Foo() as foo:
print("hello python")
a = 1/0
print("hello end")
執(zhí)行結(jié)果:
enter called Traceback (most recent call last): hello python exit called exc_type :<class 'ZeroDivisionError'> exc_val :division by zero File "F:/workspaces/python_workspaces/flask_study/with.py", line 25, in <module> a = 1/0 exc_tb :<traceback object at 0x0000023C4EDBB9C8> ZeroDivisionError: division by zero Process finished with exit code 1
我們看到,執(zhí)行結(jié)果的輸入順序,分析如下:
當(dāng)我們with Foo() as foo:時(shí),此時(shí)會(huì)執(zhí)行__enter__方法,然后進(jìn)入執(zhí)行體,也就是:
print("hello python")
a = 1/0
print("hello end")
語(yǔ)句,但是在a=1/0出現(xiàn)了異常,with將會(huì)中止,此時(shí)就執(zhí)行__exit__方法,就算不出現(xiàn)異常,當(dāng)執(zhí)行體被執(zhí)行完畢之后,__exit__方法仍然被執(zhí)行一次。
我們回到with open("file")as f: 不用關(guān)閉文件的原因就是在__exit__方法中,存在關(guān)閉文件的操作,所以不用我們手工關(guān)閉文件,with已將為我們做好了這個(gè)操作,這就可以理解了。
以上就是小編整理的相關(guān)內(nèi)容,如果大家有任何補(bǔ)充可以聯(lián)系腳本之家小編。
相關(guān)文章
使用Python微信庫(kù)itchat獲得好友和群組已撤回的消息
這篇文章主要介紹了使用Python微信庫(kù)itchat獲得好友和群組已撤回的消息,需要的朋友可以參考下2018-06-06
使用Python實(shí)現(xiàn)簡(jiǎn)單的人臉識(shí)別功能(附源碼)
Python中實(shí)現(xiàn)人臉識(shí)別功能有多種方法,依賴于python膠水語(yǔ)言的特性,我們通過(guò)調(diào)用包可以快速準(zhǔn)確的達(dá)成這一目的,本文給大家分享使用Python實(shí)現(xiàn)簡(jiǎn)單的人臉識(shí)別功能的操作步驟,感興趣的朋友一起看看吧2021-12-12
Flask框架debug與配置項(xiàng)的開啟與設(shè)置詳解
這篇文章主要介紹了Flask框架debug與配置項(xiàng)的開啟與設(shè)置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09
Python實(shí)現(xiàn)簡(jiǎn)單的索引排序與搜索功能
這篇文章主要介紹了Python實(shí)現(xiàn)簡(jiǎn)單的索引排序與搜索功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
python實(shí)現(xiàn)從ftp上下載文件的實(shí)例方法
在本篇文章里小編給大家整理了關(guān)于python實(shí)現(xiàn)從ftp上下載文件的實(shí)例方法,需要的朋友們可以參考下。2020-07-07
python?request要求接口參數(shù)必須是json數(shù)據(jù)的處理方式
這篇文章主要介紹了python?request要求接口參數(shù)必須是json數(shù)據(jù)的處理方式,Reqeusts支持以form表單形式發(fā)送post請(qǐng)求,只需要將請(qǐng)求的參數(shù)構(gòu)造成一個(gè)字典,然后傳給requests.post()的data參數(shù)即可,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-08-08
kaggle+mnist實(shí)現(xiàn)手寫字體識(shí)別
這篇文章主要為大家詳細(xì)介紹了kaggle+mnist實(shí)現(xiàn)手寫字體識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Python編程實(shí)現(xiàn)tail-n查看日志文件的方法
這篇文章主要介紹了Python編程實(shí)現(xiàn)tail-n查看日志文件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07

