基于生成器实现对方法的上下文管理器

多嵌套上下文管理器

from contextlib import ExitStack

class A:
    def __enter__(self):
        print("A enter")
        return self

    def __exit__(self, t, v, trace):
        print("A exit")

class B:
    def __enter__(self):
        print("B enter")
        return self

    def __exit__(self, t, v, trace):
        print("B exit")

with ExitStack() as stack:
    a = stack.enter_context(A())  # 按照进入 stack 的顺序,先入后出的执行 __exit__ 方法
    b = stack.enter_context(B())
    print(a)
    print(b)