N Randhawa..
56
如果你知道什么是上下文管理器,那么你就不需要了解__enter__和__exit__魔术方法.让我们看一个非常简单的例子.
在这个例子中,我在open函数的帮助下打开myfile.txt.在尝试/终于块确保即使发生意外的异常myfile.txt的将被关闭.
fp=open(r"C:\Users\SharpEl\Desktop\myfile.txt")
try:
for line in fp:
print(line)
finally:
fp.close()
现在我用with语句打开同一个文件:
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__魔术方法.