Python拾遗之特殊函数 __enter__ 和__exit__

上下文管理器 (context manager) 是Python2.5开始支持的一种语法,用于规定某个对象(往往是类实例对象)的使用范围。一旦进入或者离开,这会触发相应的生命钩子(enterexit)函数,在钩子函数中可以定义,特殊操作例如,对象分配或者释放内存甚至如下的回收文件句柄。调用构建有钩子函数的类实例时,往往依赖形式为with…as…的语法。

with open("file.txt", "w") as f:
    f.write("Hello World!")
    """
    def __exit__(self, *excinfo): # real signature unknown; restored from __doc__
        # __exit__(*excinfo) -> None.  Closes the file.
        pass
    """    
    # 离开 with···as···的语法范围将 触发 __exit__ ,在该函数下定义了关闭方法

print(f.closed)  # True

自定义管理器

class CustomManage(object):
    def __init__(self, arg=None):
        self.arg = arg

    def __enter__(self):
        return '---enter---'

    def __exit__(self, exc_type, exc_value, traceback):
        print '---exit---'
        print exc_type, exc_value, traceback

if __name__ == '__main__':
    try:
        with CustomManage() as cm:
            print '---start---'
            print cm
            print '---end---'
    except Exception as e:
        print e

运行结果

---start---
---enter---
---end---
None None None
---exit---
  • 其中, exc_type, exc_value, traceback 为向CustomManage实例对象内部内部传递的异常信息,若无没有这都为None
    若有,则如下
if __name__ == '__main__':
    try:
        with CustomManage() as cm:
            print '---start---'
            print cm
            raise ValueError('引发一个错误')
            print '---end---'
    except Exception as e:
        print e # 异常详情在此处打印

结果如下

---start---
---enter---
<type 'exceptions.ValueError'> 引发一个错误 <traceback object at 0x0000000002B23D48>
---exit---
引发一个错误
  • 此时,当抛出一个异常后,print ‘—end—’ 并没有自信,with ···as···至此截止,结束钩子函数_ exit _() 依旧被执行

版权声明:本文为ChangerJJLee原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。