본문 바로가기
공부/Python

[python] 클래스를 함수처럼 사용할수 있게.. __call__함수

by 병진들 2021. 6. 15.

python memoize를 공부하다가 __call__함수에 대해 먼저 확실하게 이해하고 가려고 정리 하게 되었다.

__call__

이 함수는 클래스의 객체를 호출할 수 있게 만드는 함수이다.

 

class Callmsg:

    def __init__(self):
        self.msg = "__call__ Test"

    # 아래 함수를 클래스에 추가
    def __call__(self):
        return self.msg

 

위와 같은 __call__객체를 가진 class가 있을 때, __init__에서 msg변수에 문자열(__call__ Test)을 할당해 주고

일반적인 방법으로 msg를 출력하는 방법은 아래와 같다.

 

obj = Callmsg()
print(obj.msg) # '__call__ Test'

 

하지만 __call__ 함수가 있을경우, 클래스 객체 자체를 호출하면 __call__함수의 return 값이 반환된다.

아래는 클래스 객체를 호출(call)한 예시이다. 실행결과는 같다.

 

obj = Callmsg()
print(obj()) # '__call__ Test'

 

왜 사용하나..?

여기까지 봤을 때, 그냥 클래스자체를 호출하지 않고, 클래스를 선언하고 변수를 따로 선언해주면 되는거 아닌가? 싶을 수 있겠지만 개인적인 의견으로는 이렇게 사용하는데는 이유가 있는 것 같다.

 

- 클래스의 인스턴스를 함수로 취급 후 다른 함수의 파라미터로 사용하기 위해서

class Callmsg:
    
    def __init__(self):
        self.msg = "이 메세지는 __call__ 테스트 메세지 입니다. : "

    def printMsg(self, user_msg):
        um = self.msg + user_msg
        return um

    # 아래 함수를 클래스에 추가
    def __call__(self, user_msg):
        return self.printMsg(user_msg)

 

이전에 사용했던 방법은 단순하게 오브젝트를 호출했던 거라면 

아래방법은 클래스 자체를 인스턴스함수로 취급하고 변수를 넣어 사용하는 방법이다.

 

obj = Callmsg()
print(obj("Oh no")) #  '이 메세지는 __call__ 테스트 메세지 입니다. : Oh no'

 

만약, 클래스객체에 __call__ 메소드가 없다면 클래스 인스턴스를 함수처럼 사용할 수 없고 호출이 불가능하다는 Error가 나온다.

이 경우 callable(obj)함수를 사용하면 boolean type으로 호출이 가능한지 불가능한지 나타난다.

 

callable(obj) # True

 

댓글