我计划使用便捷的with语句,在我的Python类中实现类似C++构造函数/析构函数的功能。我之前只用过这个语句来进行文件IO,但我认为它对于连接型通信任务也会很有帮助,例如sockets或数据库连接等,最终需要关闭的事物。
在PEP 343中(如上所述),提到了
产生了预期的输出:
在PEP 343中(如上所述),提到了
with
需要__enter__
和__exit__
方法,在我的简单实现中,这些方法看起来能够按预期工作。class MyConnection:
def __init__(self):
pass
def __enter__(self):
print "constructor"
# TODO: open connections and stuff
# make the connection available in the with-block
return self
def __exit__(self, *args):
print "destructor"
# TODO: close connections and stuff
with MyConnection() as c:
# TODO: do something with c
pass
产生了预期的输出:
constructor
destructor
这么简单就可以了吗?除此之外还有什么需要考虑的因素吗?为什么很多库(显然)缺乏这个功能?我是否漏掉了什么?
__exit__
接受三个参数:异常类型、其值和回溯(如果没有异常发生,则为 3 个None
)。Python 将它们作为位置参数传递,因此不需要使用**kwargs
。 - yak