目录
零、让对象支持上下文管理协议
上下文管理协议:context-management protocol ,通过 with 语句触发。
只要对象内实现 __enter__() 和 __exit__() 方法,就能兼容 with 语句,触发上下文管理。
一、上下文管理的简单执行流程
with 工作原理 (1)紧跟with后面的语句被求值后,返回对象的“
__enter__()
”方法被调用,这个方法的返回值将被赋值给as后面的变量; (2)当with后面的代码块全部被执行完之后,将调用前面返回对象的“__exit__()
”方法。class Sample: def __enter__(self): print "in __enter__" return "Foo" def __exit__(self, exc_type, exc_val, exc_tb): ''' 若在执行流程中因为错误而退出,调用exit时,会自动捕获错误信息 exc_type: 错误的类型(异常类型) exc_val: 错误类型对应的值 (异常值) exc_tb: 代码中错误发生的位置 (错误栈) ''' print "in __exit__" def get_sample(): return Sample() with get_sample() as sample: print "Sample: ", sample ''' 流程总结: 1- 执行get_sample()函数 2- 函数内实例化Sample对象,执行__enter__返回字符串赋予sample变量 3- 执行with内的代码块,输出sample变量值 4- 执行Sample对象内的__exit__方法 '''
二、错误执行流程
class Sample(): def __enter__(self): print('in enter') return self def __e