通过实现 __enter__() 和 __exit__() 方法可以使自定义的类支持 with 语句
例如:
class Open:
def __init__(self, filename, option):
self.filename = filename
self.option = option
self.fp = None
def read(self):
return self.fp.read()
def __enter__(self):
print('__enter__')
self.fp = open(self.filename, self.option)
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('__exit__')
self.fp.close()
with Open('text', 'r') as f:
print(f.read())
执行结果如下:
__enter__
python
javascript
django
mysql
__exit__
编写上下文管理器的主要原理是你的代码会放到 with 语句块中执行。 当出现 with 语句的时候,对象的 __enter__() 方法被触发, 它返回的值(如果有的话)会被赋值给 as 声明的变量。然后,with 语句块里面的代码开始执行。 最后,__exit__() 方法被触发进行清理工作。