개발/python-심화(Advanced)
Magic Method (3) - __add__, __mul__, __sub__, __le__, __ge__
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