我可以使用`__exit__`方法而不是`__enter__`方法创建一个类吗?

时间:2017-06-06 20:29:21

标签: python python-3.x tensorflow

我有一个类需要为该类的每个实例运行TensorFlow会话,只要该实例存在。

TensorFlow会话使用上下文管理器,但我不想强迫任何使用我的类的人将我的类放入上下文管理器。

如果在不使用上下文管理器的情况下不再使用实例,有没有办法自动关闭会话?

我可以只使用__exit__方法而不是__enter__方法并在没有上下文管理器的情况下启动会话,只关闭退出会话吗?

2 个答案:

答案 0 :(得分:2)

  

如果在不使用上下文管理器的情况下不再使用实例,有没有办法自动关闭会话?

不是真的,当一个物体不再被使用时,它会如何解决?如果有一种安全的方法可以做到这一点,那么首先就不需要上下文管理器。

所以你使用上下文管理器和with语句来获得这种反馈。但仅仅因为你必须使用上下文管理器,这并不意味着你实际上需要打开一些单独的“东西”。您可以在__enter__方法中返回任何内容,包括当前对象。

因此,在上下文关闭时关闭自身的最简单的上下文管理器实现如下所示:

class MyClass:
    def __enter__ (self):
        return self

    def __exit__ (self, *exc):
        self.close()

    def close (self):
        # actually close the object

事实上,这种模式非常普遍,这个上下文管理器有一个内置的配方:contextlib.closing。使用它,您实际上根本不需要修改您的类,您可以将其包装在closing()调用中,并在退出上下文时调用close

with closing(my_object):
    my_object.do_something()

# my_object.close() is automatically called

答案 1 :(得分:1)

您必须定义__enter__方法,但您可以将其定义为:

def __enter__(self):
    return self

并在init中定义会话。然后,像这样定义__exit__

def __exit__(self, *exc):
    self.close()

然后,定义一个close方法,关闭__init__中打开的任何资源。 (就我而言,这是一个TensorFlow会话。)

这样,如果用户决定使用上下文管理器,它将为它们关闭它,如果它们没有,它们将不得不自己关闭它。