python中with语句用的最多的一般是在打开文件的时候,使用with可以在退出这个语句块的时候自动释放文件句柄。
想想这种自动释放确实很方面,在其他一些需要占用系统资源或者IO的地方很值得一用。
总结下两个实现with语句的方法。
1. 使用__enter__ 和 __exit__
class OpenFile():
def __init__(self,filename):
self.filename = filename
self.fp = None
def __enter__(self):
self.fp = open(self.filename,'w+')
return self.fp
def __exit__(self,exc_type,exc_val,exc_tb):
self.fp.close()
if __name__ == "__main__":
with OpenFile("2.txt") as f:
f.write("test")
2. 使用装饰器contextmanager
使用with时,会执行到yield处,知道运行到with语句块结束时,会从yield处往下执行
from contextlib import contextmanager
@contextmanager
def self_file_open():
try:
fp = open("1.txt",'w+')
yield fp
except Exception as e:
raise e
finally:
fp.close()
值得一提的是,with ... as ... 中的as取决于 __enter__ return的值 或者 yield返回的值。。如果无return或yield,那么as 就没意义。