形如下文的代码。
with Sample() as ha: #Sample是类名
print("sample:", ha )
一般来说类中会实现以下两个方法。
def __enter__(self):
def __exit__(self, type, value, trace):
如:
class Sample:
def __init__(self):
print("In __init__()")
def __enter__(self):
print("In __enter__()" )
return "Foo"
def __exit__(self, type, value, trace):
print("In __exit__()")
def get_sample():
return Sample()
with Sample() as ha:
print("sample:", ha )
print('执行a=1/0之前')
a = 1 / 0
print('执行a=1/0之后')
其执行过程为:
- 类的__init__()方法执行
类的__enter__()
方法被执行ha被赋值:__enter__()
方法返回的值(这个例子中是”Foo”)被赋值给变量ha- 执行执行
with-block
中的语句,即执行print("sample:", ha )等语句 - 类的
__exit__()
方法被调用(如with-block
中的语句遇到错误,则会立即调用exit()方法,然后报错)
(若with-block
中的语句出现错误,如a=1/0,则会忽略with-block中a=1/0之后的语句,立即调用
__exit__()
方法,然后报告错误,)
输出如下:
In __init__()
In __enter__()
sample: Foo
执行a=1/0之前
In __exit__()
Traceback (most recent call last):
File "F:\PythonCode\venv\Main.py", line 17, in <module>
a = 1 / 0
ZeroDivisionError: division by zero