# 建一个测试文件
! echo -e 'line1\nline2\nline3' > sample.txt
! cat sample.txt
line1
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__
了