with上下文管理器
1.with 语句的执行过程:
在执行 with 语句时,首先执行 with 后面的 open 代码
执行完代码后,会将代码的结果通过 as 保存到 f 中
然后在下面实现真正要执行的操作
在操作后面,并不需要写文件的关闭操作,文件会在使用完后自动关闭
2. with 语句的执行原理
实际上,在文件操作时,并不是不需要写文件的关闭,而是文件的关闭操作在 with 的上下文管理器中的协议方法里已经写好了。
当文件操作执行完成后, with语句会自动调用上下文管理器里的关闭语句来关闭文件资源。
3.上下文管理器
with 语句在执行时,需要调用上下文管理器中的 __enter__ 和 __exit__ 两个方法。
__enter__ 方法会在执行 with 后面的语句时执行,一般用来处理操作前的内容。比如一些创建对象,初始化等。
__exit__ 方法会在 with 内的代码执行完毕后执行,一般用来处理一些善后收尾工作,比如文件的关闭,数据库的关闭等。
4.自定义上下文管理器,代码如下(注释很重要!!!)
class MyCount(object):
def __init__(self, x, y):
self.__x = x
self.__y = y
def __enter__(self):
"""with退出时自动执行的语句"""
print("with退出时执行的语句")
# 需要注意的是:
# 1.MyCount()创建对象并命名为mc====>with MyCount(6, 0) as mc:相当于mc = MyCount(6, 0)
# 2.在使用div方法之前会先调用__enter__方法,self代表的就是mc
# 3.所以直接返回self即可,也可以不返回,没有影响
return self
def __exit__(self, exc_type, exc_val, exc_tb):
# 通过 参数接收到的值,来判断程序执行是否出现异常
# 如果是 None ,说明没有异常
print("with结束时自动执行的语句")
if exc_type == None:
print('计算正确执行')
else:
# 否则出现异常,可以选择怎么处理异常
print(exc_type)
print(exc_val)
print(exc_tb)
# 返回值决定了捕获的异常是否继续向外抛出
# 如果是 False 那么就会继续向外抛出,程序会看到系统提示的异常信息
# 如果是 True 不会向外抛出,程序看不到系统提示信息,只能看到else中的输出
return True
def div(self):
print(self.__x / self.__y)
with MyCount(6, 0) as mc:
mc.div()
执行结果:
5.总结
- with 语句主要是为了简化代码操作。
- with 在执行过程中,会自动调用上下文管理器中的 __enter__ 和 __exit__ 方法
- __enter__ 方法主要用来做一些准备操作
- __exit__ 方法主要用来做一些善后工作
如果你和我有共同爱好,我们可以加个好友一起交流!
还没有评论,来说两句吧...