import sys class LookingClass: def __enter__(self): self.original_write = sys.stdout.write sys.stdout.write = self.reverse_write return 'JABBERWOCKY' def reverse_write(self, text): return self.original_write(text[::-1]) def __exit__(self, exc_type, exc_val, exc_tb): sys.stdout.write = self.original_write if exc_type is ZeroDivisionError: print('Please DO NOT divide by zero!') return True # 1 测试LookingClass with LookingClass() as what: print('Alice, Kitty and Snowdrop') print(what) # 这时with已经吧LookingClass关闭了 print('Back to normal.') # 2 直接实例化LookingClass manager = LookingClass() print(manager) print(manager.__enter__()) print(manager) # 没有退出上下文管理器 print(manager.__exit__(None, None, None)) print(manager) # 恢复正常
举个例子:
import sys import contextlib @contextlib.contextmanager def looking_class(): original_value = sys.stdout.write def reverse_write(text): return original_value(text[::-1]) sys.stdout.write = reverse_write # 增加处理__exit__方法时的异常 msg = '' try: yield 'JABBERWOCKY' except ZeroDivisionError: msg = 'Please DO NOT divide by zero!' finally: sys.stdout.write = original_value if msg: print(msg) with looking_class() as wp: print('I love Python') print(wp)