上下文管理器是python特殊的管理器,实现了上下文管理协议类。上下文管理器最常用的场景: 打开某个资源处理,最后进行关闭;确保加锁后得以释放
一、上下文语法形式
with expression [ as variabkle]
代码......
二、上下文管理器实现方式
2.1 自定义类 实现 __enter__ , __exit__ 方法
实现过程: 调用对象__enter__方法,如果as语句存在,则将__enter__返回值 复制给目标对象,否则就会丢弃
执行with 语句中的代码。
调用对象__exit__方法,不管是否有异常发生,__exit__ 方法都会被调用
#!/usr/bin/python
#-*- coding: UTF-8 -*-
import codecs
class Open(object):
def _ init__(self, filename, mode , encoding=”utf-8 "):
self.fp =codecs.open(filename , mode , encoding)
def __enter__(self):
return self.fp
def __exit__(self, exc type, exc_val , exc_t b):
self.fp.close()
data = '上下文管理器'
with open('data.txt', 'w') as f:
f.write(data)
2.2 使用 contextlib 实现上下文管理器
import codecs
from contextlib import contextmanager
@contextmanager
def Open(filename, mode, encoding='utf-8'):
fp = codecs.open(filename, mode, encoding)
try:
yield fp #类似于__enter__
except Exception as error:
print(error)
finally: #类似于__exit__
fp.close()
data = u'上下文管理器'
with Open('data.txt','w') as f:
f.write(data)
2.3 最简单的文件复制
with open('file1.txt','r') as source:
with open('file2.txt','w') as target:
for line in source:
target.write(line)