+와 같은 연산자에 사용자 정의 객체가 응답할 수 있게 헤주는 몇몇 특별 메서드가 있다.
2차원 유큘리드 벡터를 나타내는 클래스를 구현한다.
v1 = Vector(2,4)
v2 = Vector(2,1)
v1 + v2 # Vector(4,5)
- 연산자의 결과로 Vector형이 나온다는 점에 주의하여 Vector 형은 콘솔에서 Vector로 표현하므로 내장된 abs() 함수는 정수나 실수의 절댓값을 반환하고, complex 형의 경우에도 값을 한 개만 반환하기에 API역시 벡터의 크기를 계산하는데 abs() 함수를 사용한다.
v = Vector(3,4)
abs(v) #5.0
- 연산자를 사용하여 스칼라곱을 수행할 수 있다.
v*3
#Vector(9,12)
abs(v * 3) #15.0
repr(), abs(), add(), mul() 특별 메서드를 이용하여 방금 설명한 연산을 구현
from math import hypot
class Vector:
def __init__(self, x=0,y=0):
self.x = x
self.y = y
def __repr__(self):
return 'Vector(%r,%r)' % (self.x, self.y)
def __abs__(self):
return hypot(self.x, self.y)
def __bool__(self):
return bool(abs(self))
def __add__(self, other):
x = self.x + other.x
y = self.y + other.y
return Vector(x,y)
def __mul__(self, scalar):
return Vector(self.x * scalar, self.y * scalar)
init()을 제외하고 5개의 특별 메서드를 구현했지만, 클래스 내부나 콘솔의 테스트 코드에선 직접적으로 호출하지는 않는다는 점을 주의해야한다.
repr() 특별 메서드는 객체를 문자열로 표현하기 위해서 repr() 내장 메서드에 의해서 호출이 된다.
%연산자를 사용하는 고전적인 포맷 문자열에서의 %r 플레이스홀더
str.format()메서드에서 사용하는 포맷 문자열 구문
대화형 콘솔과 디거버는 평가된 표현식의 결과에 repr()을 호출한다.
repr() 메서드가 반환한 문자열은 명확해야 하며, 가능하다면 표현된 객체를 재생성하는데 필요한 소스 코드와 일치해야 한다.
repr()과 str()을 비교한다
위의 두 가지 특별 메서드 중 하나만 구현해야 한다면, repr() 메서드를 구현하라.
파이썬 인터프리터가 str() 메서드가 구현되지 않을 경우 repr()메서드를 호출하기 때문이다.
add()와 mul()의 기본 사용법을 보여주기 위해서 + 와 * 연산자를 구현하고 이 경우 모두 메서드는 Vector 객체를 새로 만들어서 반환하고 두 개의 피연산자는 변경하지 않는다. 중위 연산자는 의례적으로 피연산자를 변경하지 않고 객체를 새로 만든다.
피연산자(if, while, or, not)로서 불리언형이 필요한 곳에선 어떠한 객처라도 사용 가능
bool()이나 len()을 구현하지 않는 경우, 사용자 정의 클래스의 객체는 참된 값이라고 간주한다.
구현할 bool(x)의 개념