如何理解上下文管理器, 那就是有先 有后, 中间是要处理的东西。
举个例子:
别墅独立小院, 是不是有个大门。每天进大门然后出大门(有先有后),中间呢 是你在这个小院里操作各种内容,比如打水。
上下文管理器指符合上下文协议的一个类,类中实现了__enter__方法 和 exit 方法。 在一段代码执行前, 先执行__enter__中的代码用于预处理,然后执行 with 中间的代码,最后执行完这段代码之后再执行 exit 中的代码进行清理工作。
常见的如:
文件的操作:打开文件,关闭文件
打开数据库,关闭数据库
入栈,出栈
都可以用上下文管理器来完成。
具体可以参考官网里这块的代码实现逻辑来加深理解。
上下文管理器格式:
class A():
def __enter__(self):
print('连接')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('断开连接')
if(exc_tb):
print('出现异常')
else:
print('无异常')
return True
__enter__方法实现资源的连接过程
__exit__方式实现了资源的断开过程
with语句基本结构
with A() as b:
# 相关操作代码放这里
-------------------------
with A():
# 相关操作代码放这里
在with语句中的操作代码执行前,先执行__enter__中的代码;操作代码执行完后,再执行__exit__中的代码
enter=>with=>exit
这段代码里需要理解一下as b
在 with A() as b 中,b的值为__enter__方法的返回值,一般情况下会写self即返回上下文管理器对象本身,但是也可以返回其他内容
__exit__方法中的参数除了self外还必须有exc_type,exc_val,exc_tb;当操作代码部分没有出现异常时,三个参数的值都为空,当操作代码部分出现异常时分别传入异常的类型、信息、错误堆栈
__exit__的返回值可以是True或False,当返回True时若操作代码出现异常则在with语句外将不会给出异常(在__exit__中处理异常),当返回False时若操作代码出现异常则在with语句外给出异常(由外部处理异常)
举个数据库的简单例子
class DataBase():
def query(self):
print('查询数据库')
def __enter__(self):
print('连接数据库')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('断开数据库连接')
if(exc_tb):
print('出现异常')
else:
print('无异常')
return True
with DataBase() as db:
db.query()

上下文管理器是Python中用于自动管理资源(如文件、数据库连接等)的机制,通过__enter__和__exit__方法实现资源的获取与释放。在with语句中,先执行__enter__方法进行初始化,接着执行with块内的代码,最后通过__exit__方法进行清理。例如,在数据库操作中,__enter__用于建立连接,__exit__用于断开连接。with语句确保了即使发生异常,资源也能被正确地释放。这种机制简化了错误处理并提高了代码的可读性。
795

被折叠的 条评论
为什么被折叠?



