본문 바로가기
[Language] - Python

# 19. [Magic Method] __call__()

by Bebsae 2021. 11. 19.

필자는 pytorch를 다루면서 신기한 점이 있었다. 뭐.. 그렇게 대단한건 아닐 수도 있지만, 모델 클래스에 대한 인스턴스를 생성하면 해당 인스턴스를 마치 함수처럼 쓰는 것을...

맨 처음에는 별 다른 생각없이 다른 사람들의 코드를 보고 따라 썼다. 하지만, 쓰면 쓸수록 궁금증이 머리에서 맴돌았다. 어떻게 인스턴스를 함수처럼 사용하는 걸까?

결론은 매직 메소드 (magic method)에 있었다. 파이썬이라는 언어는 진짜 마법처럼 사전에 모든 클래스에 정의된 매직 메소드라는 것이 있다. 언더바(_)가 앞뒤로 붙은 메소드들을 볼 수 있을 것이다. 더군다나 pycharm을 사용한다면 특별히 다르게 색이 빛나는 메소드들을..

 

매직 메소드 목록


위 스크린샷에서 볼 수 있다시피 predefined 라는 글자가 눈에 밟힌다.. '사전에 정의된'
사전에 모든 클래스에 정의된 매직 메소드들을 우리는 오버라이딩 하는 것이다. 평소에 아무렇지 않게 쓰던 생성자(__init__)라고 부르는 메소드도 사실 매직 메소드 중 하나일 뿐이다.

우리는 매직 메소드들을 통해 새로운 자료구조를 만들거나 뭐.. 다양한 일들을 할 수 있다. 예시는 여기서 필자가 직접 작성한 QTableFormat 보면 된다.

암튼 각설하고 이번에는 __call__() 메소드에 대해 말해볼까 한다. 너무 간단하지만, 오히려 간단하기 때문에 코드를 읽는 사람 입장에서는 직관적인 코드, 파이써닉한 코드를 작성할 수 있는 강력한 도구다.

class LSTM: 
    def __call__(self, x): 
        print(x) 
        
lstm = LSTM() lstm('hi') 

>> hi


진짜 이걸 포스트로 쓰는게 날로 먹나싶을 정도로 간단한 코드다. 하지만, 강력하다. 다시 한번 강조하지만, 인스턴스를 함수처럼 사용할 수 있게 되는 메소드이다. 위 코드는 너무 간단하기 때문에 '에이 이게 뭐야' 할 수 있겠지만, 실제로 우리가 딥러닝을 할때에 엄청나게 복잡한 모델 인스턴스에 거대한 텐서를 대입할 때.. 모델 인스턴스에 텐서를 주입하는 구나 라고 아주 직관적으로 알 수 있다. 이는 코드의 가독성을 높일 수 있는 아주 좋은 방법론이다.

'[Language] - Python' 카테고리의 다른 글

# 20. Counter  (0) 2022.03.01
# 18. 데코레이터 (Decorator)  (0) 2021.11.09
# 17. [Magic Method] __new__() & __init__()  (0) 2021.08.02
# 16. eval  (0) 2021.08.02
# 15. [Tip] chunk  (0) 2021.06.02

댓글