2017-06-06 101 views
0

我有一个类需要为类的每个实例运行TensorFlow会话,只要该实例存在。我可以用`__exit__`方法创建一个类而不是`__enter__`方法吗?

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

如果没有使用上下文管理器,实例不再使用,是否有任何方法可以自动关闭会话?

我可以直接放入__exit__方法而不是__enter__方法,并在没有上下文管理器的情况下启动会话,只需关闭退出中的会话?

+2

为什么会加入一个'__enter__'方法力用户使用上下文管理器? –

+0

你的用户*应该*在这种情况下使用上下文管理器...... –

+0

我也不明白为什么你要在*你的类中定义'__exit__'方法*如果你不想使用上下文管理器? –

回答

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 
+0

有没有什么我可以在我的init方法中做,这将允许我的类具有与MyClass相同的功能,而无需指定(非常多余的)'__enter__'和'__exit__'方法? –

+1

你总是可以将'__enter__'和'__exit__'定义移动到一个新的类中,然后继承它。由于Python允许多重继承,因此可以将它视为一个* mixin *,为您提供这种“可关闭性”。 – poke

1

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

def __enter__(self): 
    return self 

,并有在init定义的会话。然后,定义__exit__像这样:

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

然后,定义任何资源__init__时打开关闭close方法。 (在我的情况下,这是一个TensorFlow会话。)

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

相关问题