如果您知道什么是上下文管理器,那么您就不需要再了解__enter__和__exit__魔术方法。让我们看一个非常简单的例子。
在本例中,我在open函数的帮助下打开myfile.txt。try/finally块确保即使发生意外异常,也将关闭myfile.txt。fp=open(r"C:\Users\SharpEl\Desktop\myfile.txt")
try:
for line in fp:
print(line)
finally:
fp.close()
现在我用打开同一个文件,语句是:with open(r"C:\Users\SharpEl\Desktop\myfile.txt") as fp:
for line in fp:
print(line)
如果您查看代码,我没有关闭文件&;没有try/finally块。因为with语句会自动关闭myfile.txt。您甚至可以通过调用print(fp.closed)属性来检查它——该属性返回True。
这是因为open函数返回的文件对象(在我的示例中是fp)有两个内置方法__enter__和__exit__。它也被称为上下文管理器。__enter__方法在带有块的开头调用,而__exit__方法在结尾调用。注意:with语句仅适用于支持上下文更改协议的对象,即它们具有__enter__和__exit__方法。实现这两种方法的类称为上下文管理器类。
现在让我们定义自己的上下文管理器类。class Log:
def __init__(self,filename):
self.filename=filename
self.fp=None
def logging(self,text):
self.fp.write(text+'\n')
def __enter__(self):
print("__enter__")
self.fp=open(self.filename,"a+")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("__exit__")
self.fp.close()
with Log(r"C:\Users\SharpEl\Desktop\myfile.txt") as logfile:
print("Main")
logfile.logging("Test1")
logfile.logging("Test2")
我希望现在您对__enter__和__exit__魔术方法都有了基本的了解。