인공지능을 좋아하는 곧미남

[python] __call__ 본문

code_study/python 내장함수

[python] __call__

곧미남 2021. 12. 17. 18:07

class의 magic function인 __call__에 관해 알아보겠습니다.

 

< INDEX >

1. "__call__"의 사용목적 및 기본예시

 

2. "__call__"을 사용하여 pytorch에서 nn.Module 패키지 내부적으로 수행되는 def forward(self, x)의 기능을 __call__로 구현


 

1. "__call__"의 사용목적 및 기본예시

    1) 사용 목적: 클래스의 객체를 호출하게 만들어주는 매서드 __call__!

       - class와 __init__ 매서드를 정의해주고 __call__ 매서드를 정의한 후 class 객체를 생성해주고 그 생성자를 호출하면 __call__ 매서드의 명령어가 실행된다.

 

2) 예시 코드

class A():
    def __init__(self, x, y):
        self.x = x
        self.y = y
        print(self.x, self.y)

    def __call__(self, *input, **kwargs):
        return f"call function is adding: {self.x + self.y}"
        

if __name__ == "__main__":
    """
    callable한 인스턴스는 a()이렇게 호출할 수 있다. 다만, a만 호출하면 포인터인 주소값이 저장됨.
    """
    a = A(10, 2)
    b = a()
    c = a
    print(b)
    print(c)

 

3) 출력 코드

10 2
call function is adding: 12
<__main__.A object at 0x00000231C476C7F0>

첫번째 줄: 인스턴트 생성 시 __init__ 호출 결과

두번째 줄: __call__ 메서드 호출

세번째 줄: __call__ 메서드 주소값 호출

2. "__call__"을 사용하여 pytorch에서 nn.Module 패키지 내부적으로 수행되는 def forward(self, x)의 기능을 __call__로 구현

1. def __call__(self, *args, **kwargs): 메서드로 input data를 전달 받음.

2. self.forward(*args)에 input data를 전달함.

3. def forward(self, x)에서 전달 받은 input data를 Layer 구성인 self.sequential의 인자로 전달함.

4. 그후 최종 output을 전달 받아 출력.

 

읽어주셔서 감사합니다.

Comments