02、上下文管理器
上下文管理器(context manager)是Python2.5开始支持的一种语法,用于规定某个对象的使用范围。一旦进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存)。它的语法形式是with…as…
- 关闭文件
普通做法:打开文件,读写,关闭文件。程序员经常会忘记关闭文件==。而上下文管理器可以在不需要文件的时候,自动关闭文件。
下面我们看一下两段程序:
普通做法:
f=open("test.txt","a")
f.write("Hello World!")
f.close()#只有你记得写这句才会帮你关闭文件
使用文件管理器:
with open("test.txt.txt","a") as f:
print(f.closed)
f.write("DXT") #这里!执行完这句后文件关闭,但是f这个引用还是存在的!
print(f.closed)# <--所以
输出:
False
True
with…as会帮你自动关闭文件,而且代码好像看起来更简洁了^_^
上面的上下文管理器基于f对象的__exit__()特殊方法。当我们使用上下文管理器的语法时,我们实际上要求Python在进入程序块之前调用对象的__enter__()方法,在结束程序块的时候调用__exit__()方法。对于文件对象f来说,它定义了__enter__()和__exit__()方法(可以通过dir(f)看到)。在f的__exit__()方法中,有self.close()语句。所以在使用上下文管理器时,我们就不用明文关闭f文件了。
- 自定义上下文管理器的对象
!任何定义了__enter__()和__exit__()方法的对象都可以用于上下文管理。
上面的文件对象f是内置对象,所以自带这两个特殊方法,不需自定义。
下面,我们自定义用于上下文管理器的对象,就是下面的myvow:
class VOW(object):
def __init__(self,text):
self.text=text
def __enter__(self):
print("__enter__")
self.text="I say:"+self.text
return self
def __exit__(self,type,value,traceback):
self.text=self.text+"!"
with VOW("Hollo") as myvow: #VOW("Hollo")返回对象self(此时self.text="I say:"+"Hollo")给到 myvow
print(myvow.text)
#执行完这句后,自动调用__exit__()(此时self.text="I say Hollo"+"!")
print(myvow.text)#所以再次print(myvow.text)时,myvow.text=I say Hollo!"
输出:
__enter__
I say:Hollo
__exit__
I say:Hollo!