Python

[Python] __call__ 이란

비번변경 2025. 12. 10. 11:25

개요

최근 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

 

728x90