網(wǎng)站首頁 編程語言 正文
引子
上下文管理器是一種簡化代碼的有力方式,其內(nèi)部也蘊含了很多Python的編程思想,今天我們就來探究一下Python的上下文管理器。
大家之前都知道,使用Python打開文件的時候最好要使用with語句,因為這樣就算在文件操作中出現(xiàn)了異常,也不會導致內(nèi)存泄露
代碼示例:
最簡單的文件打開方式(容易導致內(nèi)存泄露)
f = open("./xxx.txt")
f.close()
安全的文件打開方式,雖然相對復雜但是有效
# 打開文件
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('進入enter')
return self.val
def __exit__(self, exc_type, exc_value, exc_tb):
print("進入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("進入with內(nèi)部")
raise ValueError
print('t: %s' % t)
運行后結(jié)果如下圖
不難看出,語句的調(diào)用順序
先進入__enter__()中, 該方法的返回值賦值給上述代碼中with后邊的t。如果with下的語句出現(xiàn)了異常就會先執(zhí)行__exit__()語句中的內(nèi)容。如果沒有發(fā)生異常,就在執(zhí)行完畢with下方語句之后執(zhí)行__exit__()語句。
概念
上下文管理協(xié)議(Context Management Protocol)
包含方法 enter() 和 exit() ,支持該協(xié)議的對象要實現(xiàn)這兩個方法。
上下文管理器(Context Manager)
支持上下文管理協(xié)議的對象,這種對象必須實現(xiàn) enter() 和 exit() 方法。
上下文管理器定義執(zhí)行with語句時要建立的運行時上下文,負責執(zhí)行with語句塊上下文中的進入與退出操作。
通常使用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)推薦
- 2023-03-21 redis哨兵模式說明與搭建詳解_Redis
- 2023-03-04 C語言模擬實現(xiàn)字符串庫函數(shù)的示例講解_C 語言
- 2022-08-22 Python基礎異常處理梳理總結(jié)_python
- 2022-11-10 Android自定義DataTimePicker日期時間選擇器使用詳解_Android
- 2022-11-01 PyTorch實現(xiàn)MNIST數(shù)據(jù)集手寫數(shù)字識別詳情_python
- 2021-12-02 C/C++?Qt數(shù)據(jù)庫SqlRelationalTable關(guān)聯(lián)表詳解_C 語言
- 2022-08-26 C++?超詳細示例講解list的使用_C 語言
- 2022-06-01 Python中plt.plot()、plt.scatter()和plt.legend函數(shù)的用法示例_
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支