我與Python中的小白,但我已經寫了一個自動關閉功能,這樣的..什麼是編寫自動關閉類的Pythonic方法?
@contextmanager
def AutoClose(obj):
try:
yield obj
finally:
obj.Close()
我有有一個Close()方法,這個功能可以被用來三類。這是最Pythonic解決方案嗎?我應該在課堂上自己做些什麼嗎?
我與Python中的小白,但我已經寫了一個自動關閉功能,這樣的..什麼是編寫自動關閉類的Pythonic方法?
@contextmanager
def AutoClose(obj):
try:
yield obj
finally:
obj.Close()
我有有一個Close()方法,這個功能可以被用來三類。這是最Pythonic解決方案嗎?我應該在課堂上自己做些什麼嗎?
你在做什麼看起來非常好,Pythonic。儘管contextlib
標準庫已經有類似的內容,但是您必須將Close
方法重命名爲close
。
import contextlib
with contextlib.closing(thing):
print thing
我會推薦使用它來代替。畢竟,推薦的Python方法的命名約定是all_lowercase_with_underscores
。
請注意,'bluedog'也可能需要重命名他(或她)的.Close()方法爲.close(),以便使用contextlib.closing()(除非我錯了)。 –
我必須將Close()方法保留爲當前大小寫,但我可以添加一個名爲close()的別名,以便可以使用標準的contextlib.closing函數。 – bluedog
大多數Python的解決方案是定義方法__enter__
and __exit__
方法類:
class Foo(object):
def __init__(self, filename):
self.filename = filename
def __enter__(self):
self.fd = open(self.filename)
def __exit__(self, exc_type, exc_value, traceback):
self.fd.close()
而且使用:
with Foo('/path/to/file') as foo:
# do something with foo
方法__enter__
和__exit__
將進入和離開塊with
時隱式調用。還請注意,__exit__
可以讓您捕獲在塊with
內引發的異常。
功能contextlib.closing
通常用於不顯式地定義的方法__enter__
和__exit__
(但有一種方法close
)這些類。如果你定義你自己的類,更好的方法是定義這些方法。
+1 - 這是IMO的同樣好的答案。我選擇了@tom的答案,因爲這是我將在此場合使用的解決方案。這三個特定的類都有一個Close()方法,並且不需要\ _ \ _ enter \ _ \ _,所以單個auto_close函數可以用於所有三個類而不需要觸及類本身。 – bluedog
這似乎很好。你也可以在你的課堂中使用析構函數。 – akiniwa
我會避免使用析構函數(即'__del__')。這是很難推斷何時/如果被調用。請參閱接受的答案在這裏:http://stackoverflow.com/questions/1935153/del-method-being-called-in-python-when-it-is-not-expected – tom