with: __enter__ and __exit__
2015-07-30 15:51
337 查看
要使我们的对象支持with语句,必须为它实现
先看一个例子:
例子中的类是一个网络连接类,但是他在初始化的时候 并没有真正建立连接,而是在使用with语句的时候才 建立连接,所以是惰性lazy的,eg
使用with语句的时候,会触发
实际中使用with更多的情况是操作一些资源如文件, 网络连接,锁等。因为这些资源要显式的打开和关闭 ,如果忘记关闭容易引起问题,所以这种情况使用with 比较好。
__enter__和
__exit__方法。
先看一个例子:
from socket import socket, AF_INET, type=SOCK_STREAM class lazyConnection: def __init__(self, address, family=AF_INET, type=SOCK_STREAM): self.address = address self.family = AF_INET self.type = SOCK_STREAM self.sock = None def __enter__(self): if self.sock is not None: raise RuntimeError('already connected') self.sock = socket(self.family, self.type) self.sock.connect(self.address) return self.sock def __exit__(self, exc_ty, exc_val, tb): self.sock.close() self.sock = None
例子中的类是一个网络连接类,但是他在初始化的时候 并没有真正建立连接,而是在使用with语句的时候才 建立连接,所以是惰性lazy的,eg
from functools import partial conn = LazyConnection( ('www.python.org', 80) ) with conn as s: # conn.__enter__() exec, connection open s.send(b'GET /index.html HTTP/1.0\r\n') s.send('Host: www.python.org\r\n') s.send('\r\n') resp = b''.join(iter(partial(s.recv, 8192), b'')) # conn.__exit__() exec, connection close
使用with语句的时候,会触发
__enter__函数, 函数的返回值会赋值给with as后面的标识符。 然后就会执行with的body,完成后触发
__exit__函数
实际中使用with更多的情况是操作一些资源如文件, 网络连接,锁等。因为这些资源要显式的打开和关闭 ,如果忘记关闭容易引起问题,所以这种情况使用with 比较好。
相关文章推荐
- C#生成Code39条形码【非条形码字体】
- SSH配置拦截器
- neutron router-update如何增加路由
- 黑马程序员--C语言-指针函数及应用
- mongodb的用户认证
- java string 中文转换UTF-8
- 面向对象链接整理
- android:gravity="right" 没有居右侧
- Android 客户端登陆超时退出处理方案
- Eclipse 编译错误 Access restriction:The type *** is not accessible due to restriction on... 解决方案
- mysql处理上百万条的数据库如何优化语句来提高处理查询效率
- linux下vsftp软件正常启动了,也能正常连接,但是就是没办法正常浏览文件夹
- C#生成Code39条形码【非条形码字体】
- USB的枚举过程--自己写的(转载)
- Eclipse/MyEclipse自动补全的设置(自动提示)
- SetUnhandledExceptionFilter让程序优雅的崩溃
- FreeMarker使用说明
- Dom4j解析XML文档
- Android视图TMD感受
- HTML-移动端如何使用css让百分比布局的弹窗水平和垂直方向上居中