with语句经常适用于对资源进行访问的场合,确保在访问的过程中不管是否发生异常都会指执行必要的清理操作,比如文件的自动关闭以及线程中锁的自动获取与释放。
- with的实现机制是:with对象应该具有一个
__enter__()
方法和一个__exit__()
方法。 - with语句将首先调用对象的
__enter__()
方法,并将__enter__()
方法的返回值赋值给as后面的变量。当with后面的代码块全部被执行完之后,with将调用象的__exit__()
方法。
例:
class Sample:
def __enter__(self):
print("in __enter__")
return "Foo"
def __exit__(self, exc_type, exc_val, exc_tb):
#exc_type: 错误的类型
#exc_val: 错误类型对应的值
#exc_tb: 代码中错误发生的位置
print("in __exit__")
def get_sample():
return Sample()
with get_sample() as sample:
print("Sample: " ,sample)
执行代码输出为
in __enter__
Sample: Foo
in __exit__
分析运行过程:
-
进入这段程序,首先创建
Sample
类,完成它的两个成员函数 enter()、exit() 的定义,然后顺序向下定义get_sample()
函数。 -
进入
with
语句,调用get_sample()
函数,返回一个Sample()
类的对象,此时就需要进入Sample()
类中,可以看到:1. __enter__()方法先被执行 2. __enter__()方法返回的值 - 这个例子中是"Foo",赋值给变量'sample' 3. 执行with中的代码块,打印变量"sample",其值当前为 "Foo" 4. 最后__exit__()方法被调用