파이썬/기초 프로그래밍

__call__ 재정의: 클래스도 함수처럼 사용하기

Data Jun 2025. 9. 7. 23:35

파이썬에서는 __call__ 메서드를 재정의하면, 클래스의 인스턴스를 마치 함수처럼 호출할 수 있습니다.
이 덕분에 객체가 상태(state)를 내부에 유지하면서, 호출할 때마다 특정 동작을 수행하도록 만들 수 있습니다.

 

1. 예제: 평균을 계산하는 클래스

class Averager():
    def __init__(self):
        self._series = []

    # __call__ 재정의
    def __call__(self, v):
        self._series.append(v)
        print('inner >> {} / {}'.format(self._series, len(self._series)))
        return sum(self._series) / len(self._series)


# 인스턴스 생성
averager_cls = Averager()

# 호출 (함수처럼 사용 가능)
print(averager_cls(10))   # 10.0
print(averager_cls(20))   # 15.0
print(averager_cls(30))   # 20.0

동작 방식

  • averager_cls(10) 처럼 인스턴스를 함수처럼 호출하면 → 내부적으로 __call__ 메서드 실행
  • self._series 리스트에 값이 계속 누적됨
  • 호출할 때마다 평균을 계산해서 반환

 

2. 클로저와의 유사성

이 클래스는 상태를 내부에 유지하면서 호출마다 누적된 결과를 사용하는 구조입니다.
이런 점에서 함수 안에 지역 변수를 “기억”하는 **클로저(closure)**와 비슷한 동작을 합니다.

 

다만 중요한 차이점:

  • 클로저 → 함수가 외부 변수(자유 변수)를 캡처해서 기억
  • __call__ 클래스 → 인스턴스의 속성(self._series)을 통해 상태를 저장

즉, 개념적으로는 비슷하지만 **“클래스 기반의 상태 유지”**라고 표현하는 게 더 정확합니다.

 

 

정리하면

  • __call__ 메서드를 재정하면 클래스 인스턴스를 함수처럼 호출 가능
  • 내부 상태(self._series)를 저장하고 활용할 수 있어, 클로저와 유사한 효과를 낼 수 있음
  • 하지만 실제로는 클래스 속성에 상태를 저장하는 것이므로, “클로저”라기보다는 “상태를 가진 호출 가능한 객체”라고 보는 게 맞습니다.