withopen为什么会自动关闭文件流
withopen为什么会⾃动关闭⽂件流
操作⽂件我们通常需要⼿动关闭⽂件流,可是通过with open()的时候却可以⾃动关闭,这是为什么呢?其实这就是上下⽂管理器。我们来看⼀个例⼦
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
你是否想过⼀个问题,打开⽂件会抛出异常,通常打开⽂件后也需要关闭⽂件流,为什么⽤ with open()语句可以不⽤⼿动关闭⽂件流呢?
这就是上下⽂管理器
"""
class Sample:
def __init__(self):
# ⾸先执⾏这个⽅法
print("__init__")
def __enter__(self):
# 然后会⾃动调⽤这个⽅法,可以理解为获取资源
print("__enter__")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
# 这个函数会⾃动调⽤,当跳出with语句的时候,⽬的是为了释放资源
print("__exit__")
def toDo(self):
print("to do something")
"""
__enter__和__exit__构成了上下⽂管理器
"""
# 这个⽤法是不是很像 with open()呢?
with Sample() as sample:
print("aaa")
这个上下⽂管理器还可以简化⼀下
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
如何把上下⽂管理器更加简化⼀下呢?
为什么网页会自动关闭
"""
import contextlib
@tmanager # 这个装饰器把下⾯的函数包装成上下⽂管理器,主要利⽤了yiele的特性
def myFun(arg1):
print("begin", arg1)  # 相当于 __enter__ ⾥⾯的代码
yield {}  # 这⾥必须有个⽣成器
print("finished")  # 相当于 __exit__ ⾥⾯的代码
with myFun("AAA") as my:
print("BBB")

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。