2013-08-12 71 views
5

我與Python中的小白,但我已經寫了一個自動關閉功能,這樣的..什麼是編寫自動關閉類的Pythonic方法?

@contextmanager 
def AutoClose(obj): 
    try: 
     yield obj 
    finally: 
     obj.Close() 

我有有一個Close()方法,這個功能可以被用來三類。這是最Pythonic解決方案嗎?我應該在課堂上自己做些什麼嗎?

+0

這似乎很好。你也可以在你的課堂中使用析構函數。 – akiniwa

+1

我會避免使用析構函數(即'__del__')。這是很難推斷何時/如果被調用。請參閱接受的答案在這裏:http://stackoverflow.com/questions/1935153/del-method-being-called-in-python-when-it-is-not-expected – tom

回答

8

你在做什麼看起來非常好,Pythonic。儘管contextlib標準庫已經有類似的內容,但是您必須將Close方法重命名爲close

import contextlib 
with contextlib.closing(thing): 
    print thing 

我會推薦使用它來代替。畢竟,推薦的Python方法的命名約定是all_lowercase_with_underscores

+0

請注意,'bluedog'也可能需要重命名他(或她)的.Close()方法爲.close(),以便使用contextlib.closing()(除非我錯了)。 –

+0

我必須將Close()方法保留爲當前大小寫,但我可以添加一個名爲close()的別名,以便可以使用標準的contextlib.closing函數。 – bluedog

9

大多數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)這些類。如果你定義你自己的類,更好的方法是定義這些方法。

+0

+1 - 這是IMO的同樣好的答案。我選擇了@tom的答案,因爲這是我將在此場合使用的解決方案。這三個特定的類都有一個Close()方法,並且不需要\ _ \ _ enter \ _ \ _,所以單個auto_close函數可以用於所有三個類而不需要觸及類本身。 – bluedog

相關問題