파이썬에서 여러 개의 피연산자를 사용하는 연산자 오버로딩은 일반적인 이항 연산자 오버로딩과 동일한 방식으로 구현할 수 있습니다. 예를 들어, 클래스에 대해 + 연산자를 오버로딩하려면 __add__ 매직 메서드(던더 메서드)를 정의하면 됩니다.
동작 원리
핵심은 __add__ 메서드가 반드시 새로운 객체를 반환해야 한다는 점입니다. 반환된 객체가 다시 같은 타입의 인스턴스이기 때문에, a + b + c처럼 연산을 연속으로 연결(chaining)할 수 있습니다. 파이썬은 이 표현식을 왼쪽부터 차례대로 (a + b) + c와 같이 평가합니다.
예제 코드
복소수를 표현하는 클래스에서 + 연산자를 오버로딩하고, 세 개의 객체를 더하는 예제입니다.
class Complex(object):
def __init__(self, real, imag):
self.real = real
self.imag = imag
def __add__(self, other):
real = self.real + other.real
imag = self.imag + other.imag
return Complex(real, imag)
def display(self):
print(str(self.real) + " + " + str(self.imag) + "i")
a = Complex(10, 5)
b = Complex(5, 10)
c = Complex(2, 2)
d = a + b + c
d.display()실행 결과
위 코드를 실행하면 다음과 같은 출력을 얻을 수 있습니다.
17 + 17i
추가 팁
Complex 객체와 일반 숫자처럼 서로 다른 타입 간의 연산도 지원하려면, 오른쪽 피연산자일 때 호출되는 __radd__ 메서드를 함께 정의하는 것이 좋습니다. 또한 지원하지 않는 타입이 들어온 경우 NotImplemented를 반환하면 파이썬이 적절하게 처리해 줍니다.