Python

[Python] 파이썬 - 03. 클래스 __call__, callable()

Hoody Coder 2023. 2. 18. 21:45

 

앞의 게시글을 통해서 우린 파이썬 클래스의, self, __init__ 에 대해서 알게되었다. 

이젠 __init__과 비슷한 __call__에 대해서 알아보자

 

1. __call__

 __init__은 인스턴스가 초기화 할때 불러와진다.

__call__은 인스턴스가 호출될 때 불러와진다. 

class WhenCall:
    def __init__(self):
        print('init')
    def __call__(self):
        print('call')
    def hi(self):
        print('hi')

c = WhenCall()
c()
c.hi()

해당 순서대로 출력된다.

 

그러면 그냥 클래스를 선언하고 인스턴스를 따로 선언하면 되지 않을까?... 싶지만

이렇게 __call__을 활용하면 클래스의 인스턴스를 함수로 취급하여 다른 함수의 파라미터로 사용하는 응용이 가능해진다. 

아래와 같은 예제를 살펴보자

class CallExample:
    def __init__(self, num1: int, num2:int) -> None:
        self.num1 = num1
        self.num2 = num2
        
    def __call__(self) -> int:
        return self.num1 + self.num2
        
c = CallExample(1, 3)
print('인스턴스 호출', c())


def plus_one(c: CallExample) -> int:
    return (c + 1)
    
print(plus_one(c()))

 

만약 클래스 객체에 __call__이 없었다면, 위의 예시처럼 인스턴스를 함수처럼 사용하여 매개인자에 넣는 과정에서 추가적인 메서드 작성이 요구되었을것이다. 이건 궁금한 사람을 위한 결과값이지만, 만약 __init__에서 작업하면 어떨까요? 라는 궁금증이 있을수 있는데

class CallExample:
    def __init__(self, num1: int, num2:int) -> int:
        self.num1 = num1
        self.num2 = num2
        return self.num1 + self.num2
        

c = CallExample(1, 2)
print(c())

이렇게 에러가 발생한다. 

 

마지막으로 callable()을 사용하면 해당 호출이 가능한지 체크가 가능하다

위의 성공예제에서 아래한줄만 추가해보자

print('호출 가능한가요?', callable(c))

 

Index로 돌아가기