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
'공부 > Python' 카테고리의 다른 글
[python] pyinstaller 와 빌드 후 ini 환경변수 읽기(konfig) (1) | 2021.06.19 |
---|---|
[python] pyinstaller 일곱번의 삽질 for uvicorn + FastAPI (1) | 2021.06.18 |
[Python] @Decorator 파이썬 @데코레이터 (2) | 2021.06.11 |
[python] opencv를 활용한 이미지에서 표 객체 찾기(table detection) (0) | 2021.05.31 |
[python] 파이썬에서의 json(str)과 dictionary 타입.. 그리고 request (0) | 2021.05.27 |
댓글