벡터를 스칼라와 곱하기 위해 * 오버로딩하기

매일 공부(ML)·2023년 3월 3일
0

Fluent Python

목록 보기
89/130

객체지향 상용구

연산자 오버로딩: 제대로하기

벡터를 스칼라와 곱하기 위해 * 오버로딩하기

v1 = Vector([1,2,3])
v1 * 10
#Vector([10.0,20.0,30.0])

Vector 피연산자를 이용해서 곱하는 또 다른 방법은 두 벡터의 내적을 구하는 스칼라곱으로 Numpy및 이와 유사한 라이브러리에서는 * 연산자를 사용하는 경우, 벡터의 각 항목에 값을 곱하며, 벡터의 스칼라곱을 구하기 위해서 numpy.dot()함수를 사용한다.

#Vector 클래스 내부

def __mul__(self, scalar):
	return Vector(n * scalar for n in self)
    
def __rmul__(self, scalar):
	return self * scalar

scalar의 자료형을 검사하기 위해서 isinstance() 함수를 사용하지만, 구체적인 자료형으로 하드코딩하는 대신 numbers.Real ABC로 검사하며, numbers.Real은 이 메서드에 필요한 자료형을 모두 포함할 뿐만 아니라 향후에 numbers.Real ABC의 실제 서브클래스나 가상 서브클래스로 선언된 수치형 자료도 모두 포함한다.

#vector_v7.py * 연산자 메서드 추가

from array import array
import reprlib
import math
import functools
import operator
import itertools
import numbers

class Vector:
	typecode = 'd'
    
    def __init__(self, components):
    	self._components = array(self.typecode, components)
        
    def __mul__(self, scalar):
    	if isinstance(scalar, numbers.Real):
        	return Vector(n*scalar for n in self)
        else:
        	return NotImplemented
            
    def __rmul__(self, scalar):
    	return self * scalar

profile
성장을 도울 아카이빙 블로그

0개의 댓글