網(wǎng)站首頁 編程語言 正文
引子
上下文管理器是一種簡化代碼的有力方式,其內(nèi)部也蘊(yùn)含了很多Python的編程思想,今天我們就來探究一下Python的上下文管理器。
大家之前都知道,使用Python打開文件的時候最好要使用with語句,因?yàn)檫@樣就算在文件操作中出現(xiàn)了異常,也不會導(dǎo)致內(nèi)存泄露
代碼示例:
最簡單的文件打開方式(容易導(dǎo)致內(nèi)存泄露)
f = open("./xxx.txt")
f.close()
安全的文件打開方式,雖然相對復(fù)雜但是有效
# 打開文件
f = open('file.txt')
try:
for line in f:
# 讀取文件內(nèi)容 執(zhí)行其他操作
# do_something...
finally:
# 保證關(guān)閉文件
f.close()
我們最經(jīng)常使用的文件打開方式
with open('file.txt', "r") as r:
pass
如果一個對象要用with語句,那內(nèi)部要定義__enter__()方法和__exit__()方法。
以下為一個示例
class TestContext:
def __init__(self, val):
self.val = val
def __enter__(self):
print('進(jìn)入enter')
return self.val
def __exit__(self, exc_type, exc_value, exc_tb):
print("進(jìn)入exit")
print('exc_type: %s' % exc_type)
print('exc_value: %s' % exc_value)
print('exc_tb: %s' % exc_tb)
with TestContext(12) as t:
print("進(jìn)入with內(nèi)部")
raise ValueError
print('t: %s' % t)
運(yùn)行后結(jié)果如下圖
不難看出,語句的調(diào)用順序
先進(jìn)入__enter__()中, 該方法的返回值賦值給上述代碼中with后邊的t。如果with下的語句出現(xiàn)了異常就會先執(zhí)行__exit__()語句中的內(nèi)容。如果沒有發(fā)生異常,就在執(zhí)行完畢with下方語句之后執(zhí)行__exit__()語句。
概念
上下文管理協(xié)議(Context Management Protocol)
包含方法 enter() 和 exit() ,支持該協(xié)議的對象要實(shí)現(xiàn)這兩個方法。
上下文管理器(Context Manager)
支持上下文管理協(xié)議的對象,這種對象必須實(shí)現(xiàn) enter() 和 exit() 方法。
上下文管理器定義執(zhí)行with語句時要建立的運(yùn)行時上下文,負(fù)責(zé)執(zhí)行with語句塊上下文中的進(jìn)入與退出操作。
通常使用with語句調(diào)用上下文管理器,也可以通過直接調(diào)用其方法來使用。
enter()
- with語句執(zhí)行時,先獲取上下文管理器對象,隨后調(diào)用其 enter()
- 若有 as var 語句,則將返回值賦給變量var
- 可以返回上下文管理器對象本身,也可以是其他相關(guān)對象
exit()
- 帶有三個參數(shù) exc_type, exc_val, exc_tb
- 若上下文管理器對象執(zhí)行無異常,則三個參數(shù)均為 None
- 若發(fā)生異常,則三個參數(shù)分別為 異常類型,異常值和tracback信息
原文鏈接:https://blog.csdn.net/ZYM66/article/details/128384300
相關(guān)推薦
- 2022-06-22 C語言單值二叉樹真題講解_C 語言
- 2024-04-06 @Delete通過批量刪除的方法
- 2022-12-19 Tensorflow加載與預(yù)處理數(shù)據(jù)詳解實(shí)現(xiàn)方法_python
- 2022-10-14 Redisson之分布式鎖解決商品秒殺簡單示例
- 2023-07-15 監(jiān)聽鼠標(biāo)mouse事件冒泡處理
- 2022-10-14 Ubuntu18.04使用Xorg創(chuàng)建虛擬屏幕
- 2022-08-18 R語言使用cgdsr包獲取TCGA數(shù)據(jù)示例詳解_R語言
- 2022-03-20 Maven工程pom中如何定義jdk版本(maven配置jdk版本)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支