如何对实例变量使用Contextmanager?例如,假设我有一些Connection类,它必须在销毁时关闭。如果我要将其作为ContextManager实现,我可以这样做。
with Connection() as c:
c.write('FOO')
c.ask('BAR?')它会在销毁时自动关闭。但是如果我想在另一个类的__init__中使用它,比如下面的例子呢?
class Device(object):
def __init__(self):
self.connection = Connection() # Must be closed on destruction.我不希望它在构造函数退出时被关闭,它应该在对象被销毁时死掉。我可以使用__del__,但这有它的缺点。习惯了C++的RAII,这让我很困惑。
那么,在这种情况下,最好的方法是什么?
发布于 2013-01-07 00:02:10
您应该在Device.close()方法中调用self.connection.close,然后安排在您的程序中正确地调用它,也许可以使用上下文管理器。
__del__永远不值得你这么做。
发布于 2015-07-30 08:49:12
from contextlib import contextmanager
@contextmanager
def connection():
conn = Conn()
try:
yield conn
finally:
conn.close()
class Conn(object):
def close(self):
print('Closing')
class Device(object):
def __init__(self, conn):
self.conn = Conn()
with connection() as conn:
d = Device(conn)https://stackoverflow.com/questions/14183788
复制相似问题