实现上下文管理器,主要是为了简化代码,在一些文件操作和数据操作当中我们使用上下文管理器的方式可以在调用的时候更加快捷
方式1:
以文件操作为例,首先我们定义一个类,类中需要有init,enter,exit两个方法,enter一般需要返回接下来操作文件的对象,而exit一般用于收尾,就是关闭文件操作,init一般就是初始化
class MyFile(object):
def __init__(self,file_name):
print("p初始化",file_name)
self.file_name = file_name
def __enter__(self):
print("进")
self.f = open(self.file_name, "r")
return self.f
def __exit__(self, exc_type, exc_val, exc_tb):
print("退")
self.f.close()
这样一个基本的类实现好了,那么在调用的时候我们会更加简单的来执行文件操作
class MyFile(object):
def __init__(self,file_name):
print("p初始化",file_name)
self.file_name = file_name
def __enter__(self):
print("进")
self.f = open(self.file_name, "r")
return self.f
def __exit__(self, exc_type, exc_val, exc_tb):
print("退")
self.f.close()
with MyFile("./test_01.py") as f:
content = f.read()
print(content)
方式2:
基于方式1,python提供更加简单的方式来实现with上下文管理器,我们只需要定义一个函数,在函数名上加入@contextmanager,函数体中,将方式1中的enter 返回的对象,使用yeild 来声明下即可,代码如下:
from contextlib import contextmanager
@contextmanager
def MyFile(file_name):
file = open(file_name, "r")
yield file
file.close()
with MyFile("./test_01.py") as f:
content = f.read()
print(content)
这种方式更加简单,但是可能不是很容易理解;