python中的上下文管理器

刚刚看了vamei大神的上下文管理器博客,理解如下:

其实我自己经常用到上下文管理器,尤其是在打开文件的时候,如果自己比较懒,不想手工打上f.close(),使用上下文管理器就ok拉。

上下文管理器就是with ** as:

例如打开文件时,

>>> with open('test.txt', 'r') as fi:
... 

 上下文管理器在执行时会调用fi的__enter__方法,执行完毕时又会调用fi的__exit__方法,这样就完成了文件对象的创建和关闭。

我们来看下fi的magic函数有哪些:

fi = open('1', 'w')
>>> dir(fi)
['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'closed', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'mode', 'name', 'newlines', 'next', 'read', 'readinto', 'readline', 'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines', 'xreadlines']

 显然,测试下__enter__和__exit__方法:

>>> fi = open('test.txt', 'r')
>>> fi.__enter__()
<open file 'test.txt', mode 'r' at 0x107225780>
>>> fi.__exit__()
>>> fi.closed
True

 很明显,__enter__函数打开了文件,而__exit__函数关闭了文件。

通过这个原理,我们可以自己写一些带有__enter__和__exit__函数的对象,这样就可以对这些对象使用上下文管理啦。

上下文管理原理:

#with ** as:

object.__enter__()
try:
    block
#可能抛出异常
finally:
    object.__exit__()
原文地址:https://www.cnblogs.com/chybot/p/4677361.html