2013-08-12 2 views
5

나는 파이썬 멍청한 놈,하지만 난이 같은 자동 닫기 기능을 작성했습니다 ..자동 닫기 클래스를 작성하는 Pythonic 방법은 무엇입니까?

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

나는이 기능을 함께 사용할 수있는 닫기() 메소드가 세 개의 클래스가 있습니다. 가장 Pythonic 한 솔루션입니까? 대신 수업에서 뭔가를해야할까요?

+0

좋아 보인다. 클래스에서 소멸자를 사용할 수도 있습니다. – akiniwa

+1

소멸자 (예 :'__del__')를 사용하지 않는 것이 좋습니다. 언제 전화가 왔는지에 대해 추론하기는 정말로 어렵습니다. 여기에 허용 된 대답을 참조하십시오 : http://stackoverflow.com/questions/1935153/del-method-being-called-in-python-when-it-is-not-expected – tom

답변

8

당신이하고있는 일은 완전히 멋지다. contextlib 표준 라이브러리에는 이미 비슷한 기능이 있지만 Close 메서드의 이름을 close으로 바꿔야합니다.

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

이 대신 사용하는 것이 좋습니다. 결국 Python 메소드의 권장 명명 규칙은 all_lowercase_with_underscores입니다.

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을 떠날 때

with Foo('/path/to/file') as foo: 
    # do something with foo 

방법 __enter____exit__이 암시 적으로 호출됩니다

+0

'bluedog'는 또한 이름을 바꿔야 할 수도 있습니다 contextlib.closing()을 사용하기 위해 (또는 실수하지 않는 한) 자신의 (또는 그녀의) .Close() 메소드를 .close() 명령을 사용하십시오. –

+0

Close() 메서드를 현재 사례로 유지해야하지만 close()라는 별칭을 추가하여 표준 contextlib.closing 함수를 사용할 수 있습니다. – bluedog

9

대부분의 파이썬 솔루션은 방법 당신의 클래스 __enter__ and __exit__ 방법을 정의하는 것입니다. 또한 __exit__은 블록 with 안에 발생한 예외를 catch 할 수 있습니다.

contextlib.closing 기능은 일반적 명시 적 방법과 __enter____exit__ 정의 (하지만 방법이 close)하지 않는 클래스가 사용된다. 자신 만의 클래스를 정의한다면 훨씬 더 좋은 방법은이 메소드들을 정의하는 것이다.

+0

+1 - 이것은 IMO에도 똑같이 좋은 대답입니다. 저는이 기회에 사용할 해결책이기 때문에 @tom 답을 선택했습니다. 세 개의 특정 클래스는 모두 Close() 메소드를 가지고 있으며 \ _ \ _ enter \ _ \ _에 대한 요구 사항이 없으므로 단일 auto_close 함수는 클래스 자체를 건드리지 않고 세 클래스 모두에 사용할 수 있습니다. – bluedog

관련 문제