페이지

2022년 8월 27일 토요일

21.4 문제점 2: 좌항이 ndarray인스턴스인 경우

 남은 문제는 ndarray 인스턴스가 좌항이고 Variable 인스턴스가 우항인 경우입니다. 예를 들어 다음과 같은 코드입니다.

x = Variable(np.array([1.0]))
y = np.array([2.0] * x)

이 예에서 좌항은 ndarray 인스턴스이고 우항은 Variable 인스턴스입니다. 이렇게 되면 좌항인  ndarray 인스턴스의 __add__ 메서드가 호출됩니다. 하지만 우리는 우항인 Variable 인스턴스의 __radd__ 메서드가 호출되길 원합니다. 그러면서 '연산자 우선순위'를 지정해야 합니다. 구체적으로 Variable 인스턴스의 속성에 __array_priority__를 추가하고 그 값을 큰 정수로 설정해야 합니다. 다음처럼 마리죠.

class Variable:
  __array_priority__ = 200

이렇게 하면 Variable 인스턴스의 연산자 우선순위를 ndarray 인스턴스의 연산자 우선순위보다 높일 수 있습니다. 그 결과 좌항이 ndarray 인스턴스라 해도 우한인 Variable 인스턴스의 연산자 메서드가 우선적으로 호출됩니다.

이상이 연산자 오버로드 시 조심해야 할 핵심입니다. 마침내 DeZero는 *와 + 연산자를 서로 다른 타입과 섞어 사용할 수 있게 되었습니다. 이어서 다음 단계에서는 /와 - 같은 다른 연사자를 추가하겠습니다.

댓글 없음: