상세 컨텐츠

본문 제목

Magic Method (3) - __add__, __mul__, __sub__, __le__, __ge__

개발/python-심화(Advanced)

by Matthew0633 2022. 4. 15. 01:35

본문

__add__, __mul__, __sub__, __le__, __ge__

 

아직까지 필요성을 크게 느끼지는 못하지만, 내가 정의할 Class의 객체에 대해 연산자를 활용해서 사용자에게도 직관적인 연산을 정의할 수 있다면, 해당 매직메소드들을 활용할 수 있을 것이다. 간단하게만 정리해두자.

 

  • __add__ , __mul__ , __sub__:
    객체가 인자에 대해 연산기호로서 수행하기에 직관적이고 적절한 연산을 magic method 에 정의하여 활용할 수 있다. __add__ , __mul__ , __sub__ 는 각각 “+”, “_”, “-” 연산자를 활용한 기능을 정의하는 method 이다.

 

  • __le__, __ge__:
    대소구분 연산자를 활용한 연산을 정의할 수 있는 magic method이다. 각각 “<=”와 “>=” 연산기호로 가능한 연산을 정의할 수 있으며, 이외에도 객체의 대소 및 등호 연산기호 기능을 정의할 수 있는 magic method로 __eq__, __ne__, __lt__, __gt__ 등이 있다.

 

  • 예시 :
    여러 모델의 output을 바탕으로 CustomLoss Class 객체를 다룬다고 가정하고, 연산기호를 활용할 수 있는 예시를 간단하게 작성해보았다.

Pytorch기준으로, 실제로 nn.module를 상속받아 CustomLoss를 정의할 때는, forward 메소드의 결과값으로 torch.tensor 이 반환될 것이고 이러한 torch.tensor Class 내에서 연산기호에 대한 연산을 정의하고 있으므로 CustomLoss Class내에서 우리가 해당 magic method 들을 overriding 해서 활용할 일은 거의 없을 것이다

class MyCustomLoss:
        def __init__(self, outputs):
            self._loss = outputs["loss"]
        def __add__(self, loss_inst):
                return self._loss + loss_inst._loss
        def __mul__(self, loss_inst):
                return self._loss * loss_inst._loss
        def __sub__(self, loss_inst):
                return self._loss - loss_inst._loss
        def __le__(self, loss_inst):
                return self._loss <= loss_inst._loss
        def __ge__(self, loss_inst):
                return self._loss >= loss_inst._loss
    
classifier1_output = {"loss": 0.5}
classifier2_output = {"loss": 0.2}

myloss1 = MyCustomLoss(classifier1_output)
myloss2 = MyCustomLoss(classifier2_output)

print(myloss1 + myloss2) # 0.7
print(myloss1 * myloss2) # 0.1
print(myloss1 - myloss2) # 0.3
print(myloss1 <= myloss2) # False
print(myloss1 >= myloss2) # True

관련글 더보기

댓글 영역