我有一個類需要爲類的每個實例運行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__'方法*如果你不想使用上下文管理器? –