파이썬 클래스의 __enter__와 __exit__ 메서드¶
파이썬에서 with 문을 사용할 때 자동으로 호출되는 특수 메서드들이다. 이들을 구현하면 컨텍스트 매니저(Context Manager) 프로토콜을 따르는 객체를 만들 수 있다.
컨텍스트 매니저란?¶
컨텍스트 매니저는 with 문에서 사용할 수 있는 객체로, 리소스의 안전한 사용과 정리를 보장한다. 파일 처리, 데이터베이스 연결, 락 관리 등에서 유용하다.
기본 구현 예시¶
class MyClass:
def __enter__(self):
print("컨텍스트에 진입했습니다.")
return self # 객체 자신을 반환
def __exit__(self, exc_type, exc_value, traceback):
print("컨텍스트를 벗어났습니다.")
# 예외가 발생해도 이 메서드는 반드시 호출됨
return False # 예외를 재발생시킴
def do_something(self):
print("작업을 수행합니다.")
# with 구문에서 객체를 사용
with MyClass() as obj:
obj.do_something()
실행 결과:
메서드 상세 설명¶
__enter__(self)¶
with문이 시작될 때 호출됨- 반환값이
as뒤의 변수에 할당됨 - 주로 리소스 획득이나 초기화 작업 수행
__exit__(self, exc_type, exc_value, traceback)¶
with블록을 벗어날 때 호출됨 (예외 발생 시에도 반드시 호출)- 매개변수:
exc_type: 예외 타입exc_value: 예외 값traceback: 트레이스백 객체- 반환값이
True면 예외를 억제,False면 예외를 재발생
실용적인 예시: 파일 관리자¶
class FileManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
self.file = None
def __enter__(self):
print(f"파일 '{self.filename}'을 열고 있습니다...")
self.file = open(self.filename, self.mode)
return self.file
def __exit__(self, exc_type, exc_value, traceback):
print(f"파일 '{self.filename}'을 닫고 있습니다...")
if self.file:
self.file.close()
if exc_type:
print(f"예외가 발생했습니다: {exc_value}")
return False # 예외를 재발생시킴
# 사용 예시
with FileManager('test.txt', 'w') as f:
f.write("Hello, World!")
# 파일이 자동으로 닫힘
언제 사용하면 좋을까?¶
- 리소스 관리: 파일, 네트워크 연결, 데이터베이스 연결
- 상태 관리: 임시 상태 변경 후 복원
- 로깅: 작업 시작/종료 로깅
- 예외 처리: 안전한 리소스 정리
컨텍스트 매니저를 사용하면 예외가 발생해도 항상 정리 작업이 수행되므로 더 안전한 코드를 작성할 수 있다.¶
관련 글
- 파이썬 multiprocessing - 병렬 처리로 성능 향상하기
Full StackPython멀티프로세싱 - 파이썬의 MVC 패턴
Full StackPython디자인 패턴 - 콜백과 퓨처
Full StackPython비동기 - 비동기 프로그래밍 소개
Full StackPython비동기 - 순차처리, 일괄처리, 진정한 비동기
Full StackPython비동기