我有一个类需要为该类的每个实例运行TensorFlow会话,只要该实例存在。
TensorFlow会话使用上下文管理器,但我不想强迫任何使用我的类的人将我的类放入上下文管理器。
如果在不使用上下文管理器的情况下不再使用实例,有没有办法自动关闭会话?
我可以只使用__exit__
方法而不是__enter__
方法并在没有上下文管理器的情况下启动会话,只关闭退出会话吗?
答案 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会话。)
这样,如果用户决定使用上下文管理器,它将为它们关闭它,如果它们没有,它们将不得不自己关闭它。