파이썬에서는 __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)를 저장하고 활용할 수 있어, 클로저와 유사한 효과를 낼 수 있음
- 하지만 실제로는 클래스 속성에 상태를 저장하는 것이므로, “클로저”라기보다는 “상태를 가진 호출 가능한 객체”라고 보는 게 맞습니다.
'파이썬 > 기초 프로그래밍' 카테고리의 다른 글
| 파이썬 클로저(Closure)와 nonlocal 키워드 (0) | 2025.09.08 |
|---|---|
| 파이썬 클로저(Closure) 간단 이해 + 내부 구조 들여다보기 (0) | 2025.09.08 |
| functools.partial 사용법: 인수 고정 → 콜백 함수로 활용하기 (0) | 2025.09.07 |
| 일급 객체(First-class Object)란 무엇일까? (0) | 2025.09.07 |
| 파이썬 reduce로 배우는 누적 연산 (0) | 2025.09.07 |