首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对实例变量使用contextmanager

如何对实例变量使用contextmanager
EN

Stack Overflow用户
提问于 2013-01-06 23:50:08
回答 2查看 315关注 0票数 8

如何对实例变量使用Contextmanager?例如,假设我有一些Connection类,它必须在销毁时关闭。如果我要将其作为ContextManager实现,我可以这样做。

代码语言:javascript
复制
with Connection() as c:
    c.write('FOO')
    c.ask('BAR?')

它会在销毁时自动关闭。但是如果我想在另一个类的__init__中使用它,比如下面的例子呢?

代码语言:javascript
复制
class Device(object):
    def __init__(self):
        self.connection = Connection()  # Must be closed on destruction.

我不希望它在构造函数退出时被关闭,它应该在对象被销毁时死掉。我可以使用__del__,但这有它的缺点。习惯了C++的RAII,这让我很困惑。

那么,在这种情况下,最好的方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-07 00:02:10

您应该在Device.close()方法中调用self.connection.close,然后安排在您的程序中正确地调用它,也许可以使用上下文管理器。

__del__永远不值得你这么做。

票数 6
EN

Stack Overflow用户

发布于 2015-07-30 08:49:12

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14183788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档