2014-08-31 3 views
3

html 파일을 작성할 수있는 클래스를 작성하고 싶습니다.클래스 __exit__ 또는 __del__ 메소드에서 파일 닫기?

class ColorWheel(object): 
    def __init__(self, params): 
     self.params = params 

    def __enter__(self): 
     self.f = open('color_wheel.html', 'w') 
     self._write_header() 
     return self 

    def __exit__(self, type_unused, value_unused, traceback_unused): 
     self._write_footer() 
     self.f.close() 

    def wheel(self): 
     # Code here to write the body of the html file 
     self.f.write('BODY HERE') 

나는이 클래스를 사용 : 나는 그것이 될 예상대로 파일이 정확히 기록

with ColorWheel(params) as cw: 
    cw.wheel() 

이제 다음과 같은 골격을 가지고있다. 그러나 이것을 실행할 때 다음과 같은 오류가 발생합니다.

Exception ValueError: 'I/O operation on closed file' in <bound method ColorWheel.__del__ of ColorWheel.ColorWheel object at 0x0456A330>> ignored 

파일이 이미 닫혀있는 동안 닫는 것으로 가정합니다. 이 올바른지? 그렇다면 파일을 닫는 적절한 방법은 무엇입니까?

+0

당신은 * 또한 * 당신은'__del__' 방법을하지 않습니다 있습니다. –

+0

'와 함께'밖에'for'가 있습니까? – Kasramvd

+1

@ 카스라 : 그게 무슨 상관이 있습니까? –

답변

5

또한 __del__ 메서드를 사용하여 을 닫은 후 파일에을 쓰도록 시도했습니다. cw이 범위를 벗어나서 정리되면 __del__ 후크가 호출되고 그 시점에서 파일에 시도하고 쓰는 것으로 보입니다. 파일이 함께 이미 닫힌 경우 당신은 테스트 할 수 있습니다

:

if not self.f.closed: 
    # do something with file 
+1

대답이 맞습니다. * with * 문을 이해하기 위해 읽어야 할 공식 문서에 대한 참조를 추가하고 싶습니다. https://docs.python.org/3.4/reference/compound_stmts.html#the-with-statement –

+0

생각했습니다. 나는 __del__ 메소드를 가지고 있지 않았지만 다른 클래스로부터 상속받은 이후로 나왔다. 나는 위의 것을 보여주지 않았다. 나는 그것이 부적절하다고 생각했다. 이제는 모두 의미가 있습니다. – physicalattraction

+0

오브젝트가 범위를 벗어나 자마자'__del__'이 호출된다는 보장이 있습니까? 아니면 구현에 의존 하는가? –

관련 문제