2017-06-06 142 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會話。)

這樣,如果用戶決定使用上下文管理器,它將關閉它,如果他們不這樣做,他們將不得不關閉它他們自己的。

相關問題