- -- coding: utf-8 --
- @Time : 2018/3/27 16:49
- @Author : qmsggg
- @Email : luohao0414@163.com
- @File : With3.py
- @Software: PyCharm
- -- coding: utf-8 --
- @Time : 2018/3/27 16:54
- @Author : qmsggg
- @Email : luohao0414@163.com
- @File : MyWith.py
- @Software: PyCharm
- -- coding: utf-8 --
- @Time : 2018/3/27 16:57
- @Author : qmsggg
- @Email : luohao0414@163.com
- @File : ContextmanagerMY.py
- @Software: PyCharm
用的os模块,读取文件的时候,其实他是含有__enter__ exit 。 一个是with触发的时候,一个是退出的时候。 ```
-- coding: utf-8 --
@Time : 2018/3/27 16:49
@Author : qmsggg
@Email : luohao0414@163.com
@File : With3.py
@Software: PyCharm
if name == ‘main’:
with file('/etc/hosts', 'r') as f:
for line in f:
print line
>那咱们自己再实现一个标准的可以with的类。 我个人写python的时候,喜欢针对一些需要有关闭逻辑的代码,构造成with的模式 。
-- coding: utf-8 --
@Time : 2018/3/27 16:54
@Author : qmsggg
@Email : luohao0414@163.com
@File : MyWith.py
@Software: PyCharm
class echo: def enter(self): print ‘enter’
def __exit__(self, *args):
print 'exit'
if name == ‘main’: with echo() as e: print ‘name’
**output**
enter name exit
>contextlib是个比with优美的东西,也是提供上下文机制的模块,它是通过Generator装饰器实现的,不再是采用__enter__和__exit__。contextlib中的contextmanager作为装饰器来提供一种针对函数级别的上下文管理机制。
-- coding: utf-8 --
@Time : 2018/3/27 16:57
@Author : qmsggg
@Email : luohao0414@163.com
@File : ContextmanagerMY.py
@Software: PyCharm
from contextlib import contextmanager
@contextmanager def make_context(): print ‘enter’ try: yield {} except RuntimeError, err: print ‘error’, err finally: print ‘exit’
if name == ‘main’: with make_context() as value: print value
**output**
enter {} exit
Process finished with exit code 0 ```
参考: