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))