Python with as 用法与原理
用法
首先我们来看一下python中不使用with语句如何操作文件,具体代码如下:
try:
reader = open('text.txt','r')
content = reader.read()
print(content)
except Exception:
print(Exception)
finally:
reader.close()
如果使用with as ,with 后面的open函数返回的是一个file对象,同时将它赋值给reader,在 with as 里面不需要关闭文件,python会自动关闭,具体代码如下:
with open('test.txt','r') as reader:
content = reader.read()
print(content)
原理
with as 结构主要的原理是使用了上下文管理器。通过上下文管理器,python知道我们打开了一个文件,并且在操作完成之后会自动把它关闭。接下来我们自己实现一个上下文管理器的类
class FileManager(object):
def __init__(self,name,mode):
print("调用了__init__方法")
self.name = name
self.mode = mode
self.file = None
def __enter__(self):
print("调用了__enter__方法")
self.file = open(self.name, self.mode)
return self.file
def __exit__(self, exc_type, exc_val, exc_tb):
print("调用了__exit__方法")
if self.file:
self.file.close()
with FileManager('test.txt','r') as reader:
print("准备读取文件")
content = file.read()
输出结果如下:
调用了__init__方法
调用了__enter__方法
准备读取文件
文件内容
调用了__exit__方法
通过上面的程序我们可以看到:
- 首先,python在实例化类的时候调用了
__init__ 方法 - 接下来在执行with语句时它会自动调用这个类的
__enter__ 方法 __enter__ 方法执行完后才会执行 with 下面的语句块,即准备读取文件、读取文件- 最后,调用
__exit__ 方法关闭文件。
所以,如果一个类文件中包含__enter__ 方法和 __exit__ 方法,这个类就可以当作上下文管理器的类,使用 with 执行这个语句的时候会自动调用 __enter__ 方法,然后执行 with 下面的语句,最后执行 __exit__ 方法,这就是上下文管理器的特点。
|