代码如下

class Example:
    def __enter__(self):
        return '哈哈哈'

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('exit!')


def get_data():
    return Example()


with get_data() as exp:
    print(exp)

程序执行后输出结果如下

image.png

解释

with语句的原理

  1. 上下文管理协议(Context Management Protocol)
    • 包含方法__enter__()__exit__(),支持该协议的对象要实现这两个方法。
  2. 上下文管理器(Context Manager)
    • 支持上下文管理协议的对象,这种对象实现了__enter__()__exit__()方法。上下文管理器定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入退出操作。通常使用with语句调用上下文管理器,也可以通过直接调用其方法来使用。

自定义上下文管理器

如上代码就是一个自定义的上下文管理器。

  1. 执行get_data()会生成上下文管理器context_manager
  2. with后面必须跟一个上下文管理器,如果使用了as,则是把上下文管理器的__enter__()方法的返回值赋值给exp
  3. 当我们使用with的时候,__enter__()方法被调用,并且将返回值赋值给as后面的变量,并且在退出with的时候自动执行__exit__()方法

Q.E.D.


一只鹅啊