개요
최근 Python으로 작성된 코드 분석을 위해 공부를 하다가 __call__이라는 매직 메서드를 보게 되었다. 잘 모르는 부분이라 개념을 정리한다.
__call__
__call__은 Python 클래스의 특수 메서드로, 클래스의 객체를 함수처럼 호출 가능하게 만들어준다.
__call__ 메서드를 정의하면 객체 obj(arg1, arg2)를 호출할 때 obj.__call__(arg1, arg2)가 자동으로 트리거 된다. 이를 통해 객체를 함수처럼 동작하게 만들어 유연하고 재사용 가능한 코드를 작성할 수 있다.
문법
class Example:
def __init__(self):
# code
# Defining __call__ method
def __call__(self):
# code
예시 코드
바로 예시로 알아보자.
기본
아래 코드는 Klass의 객체를 호출할 때 __call__이 호출되었음을 출력하는 예시이다.
class Klass:
def __call__(self, *args, **kwargs):
print("called Klass.__call__")
객체를 출력했을 때와 객체를 호출했을 때의 차이를 보자.

객체를 호출했을 때는 객체 정보가 출력되고, 객체를 호출했을 때는 __call__ 메서드가 동작한 것을 확인할 수 있다. 즉, 객체가 생5성되었을 때 동작하는 __new__와 __init__과는 다른 역할을 한다고 이해할 수 있다.
매개변수 전달
당연한 얘기지만 __call__ 메서드에도 매개변수를 전달해서 활용할 수 있다.
아래 코드는 객체 호출 시 매개변수 a, b를 받아 두 값의 합을 반환한다.
class Klass:
def __call__(self, a, b, *args, **kwargs):
return a + b

객체에 매개변수를 전달하여 호출했을 때는 두 값의 합이 반환되지만, 객체 생성 시 매개변수를 전달했을 때는 별도의 __init__ 메서드가 정의되어 있지 않아 오류가 발생하는 것을 확인할 수 있다.
참고 문서
https://www.geeksforgeeks.org/python/__call__-in-python/
https://docs.kanaries.net/ko/topics/Python/python-call