# 建一个测试文件
! echo -e 'line1\nline2\nline3' > sample.txt
! cat sample.txtline1
line2
line3
metseq
November 8, 2022
__enter__和__exit__是什么当在类中实现__enter__和__exit__方法的使用,这个类就可以用with调用了,调用with的时候,返回__enter__的结果,退出with的时候,执行__exit__的代码。
平时用with最多的可能是打开一个文件,with返回文件的句柄(file handle),退出with的时候关闭文件。
如下代码:
line1
line2
line3
如果不用with,需要手动关闭文件。
注意上面的MyOpen类中的__exit__方法有4个参数,self不必说,后面三个参数是什么呢?
__exit__的参数class SafeDivide():
def __init__(self, a, b):
self.a = a
self.b = b
def __enter__(self):
print('exec __enter__')
print(f'{self.a} / {self.b} = ', end='')
return self
def divide(self):
return self.a / self.b
def __exit__(self, exc_type, exc_val, exc_tb):
print('\n------------')
print('exec __exit__')
print(f"exec_type: {exc_type}")
print(f"exc_val: {exc_val}")
print(f"exc_tb: {exc_tb}")exec __enter__
1 / 2 = 0.5
啦啦啦
------------
exec __exit__
exec_type: None
exc_val: None
exc_tb: None
如果执行没有问题,exc_type, exc_val, exc_tb都是None
exec __enter__
1 / 0 =
------------
exec __exit__
exec_type: <class 'ZeroDivisionError'>
exc_val: division by zero
exc_tb: <traceback object>
ZeroDivisionError: division by zero
如果执行对象的方法出现问题,就会直接执行__exit__方法,exc_type, exc_val, exc_tb包含的就是错误类型,错误值,错误的回溯信息。
出错后不会执行后面的语句,比如这里的print('啦啦啦'),而是直接执行__exit__了