Python with语句的用法

with块定义了一个runtime context(运行时上下文),当执行了with的语句时进入这个context,当执行完with块中最后一个语句时离开这个context。
当进入with块时,python会自动调用你with语句的__enter__()方法,离开with块时,python会自动调用__exit__(exc_type, exc_value, traceback)方法
with x: # python will calls x.__enter__() automatically
    pass # do something
# python will calls x.__exit__(exc_type, exc_value, traceback) automatically here

 

可以在with块中使用的类,需要拥有以下几个条件
  • 定义了__enter__()方法
  • 定义了__exit__(exc_type, exc_value, traceblack)方法
如下:
class TestCls:
    def __enter__(self):
        print('enter!')
        return self  #返回自己,用于as

    def __exit__(self, *args):
        print('exit!')

    def say(self):
        print('hello there!')

 

>>> x = TestCls()
>>> with x as obj:
        obj.say()

enter!
hello there!
exit!

 

大多数情况下__enter__()方法都会return self,在进入with块的时候会将__enter__返回的值绑定到as指示的变量,这样方便在with块中调用。
在上面的例子中,当进入with块时调用了__enter__方法,并返回self绑定到变量obj上,在with块中访问了obj.say()方法,离开with块时又自动调用了__exit__方法。
特别的,不管以何种方式(异常、错误、正常结束)导致with块结束,都会自动调用__exit__方法,所以使用with块可以比较安全的使用管理资源。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据