Context Manager

개념

  • 지난 포스팅에서 살펴봤듯 특정 작업 전후에 필요한 작업을 자동으로 처리하는 것을 의미한다.
  • __enter__() 메서드와 __exit__() 메서드가 각각 사전작업, 사후작업을 맡아 처리한다.
  • 엄밀히 구분하면 with 구문에서 직접 쓰이는 것은 컨텍스트 매니저 인스턴스 , 그리고 이를 만들어내는 클래스는 컨택스트 매니저 클래스 라고 할 수 있다.

구조

1
2
3
4
5
6
7
class ClassName:
    
    def __enter__(self, params):
        # ... 사전 처리 ...

    def __exit__(self, exc_type, exc_value, traceback):
        # ... 사후 처리 ...

예시

  • 단순히 프린트를 출력하고, 컨텍스트가 닫히면 프린트 내역을 파일로 저장하는 클래스
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class PrintRecorder:
    
    def __enter__(self):
        from datetime import datetime
        self.start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        self.print_history = list()
        return self

    def print(self, text):
        print(text)
        self.print_history.append(text)
    
    def __exit__(self, exc_type, exc_value, traceback):
        with open(f"{self.start_time}.txt", "w", encoding="utf-8") as f:
            for text in self.print_history:
                f.write(text + '\n')
  • 사용
1
2
3
4
with PrintRecorder() as p:
    p.print("안녕하세요")
    p.print("반갑습니다")
    p.print("프린트 기록 컨텍스트 매니저 테스트입니다.")
  • 2026-03-20 01:52:26.txt 파일 내용
1
2
3
4
안녕하세요
반갑습니다
프린트 기록 컨텍스트 매니저 테스트입니다.

Comments