context manager的__enter__和__exit__?context manager的__enter__和__exit__?
Context manager 支持 with 语句,保证「进入时设、退出时清」。协议:实现 __enter__(self) 和 __exit__(self, exc_type, exc_val, exc_tb)。with obj: 时先调 __enter__,其返回值赋给 as 目标;离开 with 块时调 __exit__(含异常时三个参数非 None)。
__enter__:做资源申请或状态设置,返回给 as 的可为 self 或其它对象。__exit__:做清理(关文件、释锁、回滚等);若返回 True 表示「已处理异常」,解释器不再传播;返回 False 或 None 则异常继续向上抛。若 with 块内无异常,__exit__ 的三个异常参数均为 None。
类实现上述两方法即可;或用 contextlib.contextmanager 写生成器:yield 前为 enter、后为 exit,用 try/finally 保证清理。常用于文件、锁、连接、临时状态等。
| 返回模块 | 返回总览 |