我有一个类需要为类的每个实例运行TensorFlow会话,只要该实例存在。我可以用`__exit__`方法创建一个类而不是`__enter__`方法吗?
TensorFlow会话使用上下文管理器,但我不想强迫任何使用我的类的人将我的类放到上下文管理器中。
如果没有使用上下文管理器,实例不再使用,是否有任何方法可以自动关闭会话?
我可以直接放入__exit__
方法而不是__enter__
方法,并在没有上下文管理器的情况下启动会话,只需关闭退出中的会话?
我有一个类需要为类的每个实例运行TensorFlow会话,只要该实例存在。我可以用`__exit__`方法创建一个类而不是`__enter__`方法吗?
TensorFlow会话使用上下文管理器,但我不想强迫任何使用我的类的人将我的类放到上下文管理器中。
如果没有使用上下文管理器,实例不再使用,是否有任何方法可以自动关闭会话?
我可以直接放入__exit__
方法而不是__enter__
方法,并在没有上下文管理器的情况下启动会话,只需关闭退出中的会话?
如果没有使用上下文管理器,实例不再使用,是否有自动关闭会话的方法?
不是真的,当一个对象不再被使用时该如何找出对象?如果有一个安全的方法来做到这一点,首先就不需要背景管理者。
所以你有使用上下文管理器和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
有没有什么我可以在我的init方法中做,这将允许我的类具有与MyClass相同的功能,而无需指定(非常多余的)'__enter__'和'__exit__'方法? –
你总是可以将'__enter__'和'__exit__'定义移动到一个新的类中,然后继承它。由于Python允许多重继承,因此可以将它视为一个* mixin *,为您提供这种“可关闭性”。 – poke
您必须定义一个__enter__
方法,但你可以将其定义为:
def __enter__(self):
return self
,并有在init定义的会话。然后,定义__exit__
像这样:
def __exit__(self, *exc):
self.close()
然后,定义任何资源__init__
时打开关闭close方法。 (在我的情况下,这是一个TensorFlow会话。)
这样,如果用户决定使用上下文管理器,它将关闭它,如果他们不这样做,他们将不得不关闭它他们自己的。
为什么会加入一个'__enter__'方法力用户使用上下文管理器? –
你的用户*应该*在这种情况下使用上下文管理器...... –
我也不明白为什么你要在*你的类中定义'__exit__'方法*如果你不想使用上下文管理器? –