본문 바로가기
Python/Python FAQ

Python 파이썬의 '__enter__'와 '__exit__'를 설명합니다., Explaining Python's '__enter__' and '__exit__'

by 베타코드 2023. 9. 18.
반응형

질문


나는 이것을 누군가의 코드에서 보았습니다. 이게 무슨 뜻인가요?

    def __enter__(self):
        return self

    def __exit__(self, type, value, tb):
        self.stream.close()

여기에 완전한 코드가 있습니다.

from __future__ import with_statement#for python2.5 

class a(object):
    def __enter__(self):
        print 'sss'
        return 'sss111'
    def __exit__(self ,type, value, traceback):
        print 'ok'
        return False

with a() as s:
    print s
    
    
print s

답변


이러한 마법 메서드(__enter__, __exit__)를 사용하면 with 문과 쉽게 사용할 수 있는 객체를 구현할 수 있습니다.

이 아이디어는 일종의 '클린다운' 코드가 실행되어야 하는 코드를 쉽게 작성할 수 있도록 해줍니다(마치 try-finally 블록처럼 생각해보세요). 여기에서 자세한 설명을 확인하세요.

유용한 예로는 데이터베이스 연결 객체가 있을 수 있습니다(그런 다음 해당 'with' 문이 범위를 벗어날 때 연결이 자동으로 닫힙니다):

class DatabaseConnection(object):

    def __enter__(self):
        # 데이터베이스 연결 생성 및 반환
        ...
        return self.dbconn

    def __exit__(self, exc_type, exc_val, exc_tb):
        # dbconnection이 닫히도록 확인
        self.dbconn.close()
        ...

위에서 설명한대로 with 문과 함께 이 객체를 사용하세요(Python 2.5에서 작업 중이라면 파일 맨 위에 from __future__ import with_statement를 해야 할 수도 있습니다).

with DatabaseConnection() as mydbconn:
    # 작업 수행

PEP343 -- 'with' 문도 좋은 설명이 있습니다.

반응형

댓글