세 개의 단항연산자 및 이 연산자와 연관된 특별 메서드는 같다.
abs() 내장 함수는 abs() 특별 메서드와 연관이 되어 있고, 단항 연산자는 구현이 쉬우며 self 인수 하나를 받는 적절한 특별 메서드를 구현하면 된다.
클래스에 논리적으로 합당한 연산을 수행하지만, 언제나 새로운 객체를 반환해야 하므로 연산자의 핵심 규칙을 지켜야 한다.
즉, self를 수정하지 말고 적절한 자료형의 객체를 새로 생성해서 반환해야 한다.
def __abs__(self):
return math.sqrt(sum(x * x for x in self))
def __neg__(self):
return Vector(-x for x in self)
def __pos__(self):
return Vector(self)
Vector 객체를 반복할 수 있고, Vector.init()이 반복형 인수를 받으므로 neg()와 pos()를 짧고 멋지게 구현할 수 있다.
invert() 메서드느 구현하지 않을 것이므로 Vector 객체에 ~v연산을 실행하면 파이썬은 단항 연산자 ~에 맞지 않는 피연산자라는 것을 믜미한다.
누구나 x와 +x가 같을 것이라고 생각한다.
"""
decimal.Decimal 클래스와 관련된 것으로 어떤 산술 콘텍스트에서 Decimal 객체 x를 생성하고 나서 다르게 설정된 콘텍스트에서 +x를 평가하면 x와 +x가 달라질 수 있다.
"""
#산술 콘텍스트의 정밀도를 변경하면 x와 +x가 달라질 수 있다.
import decimal
ctx = decimal.getcontext()
ctx.prec = 40
one_third =decimal.Decimal('1') / decimal.Decimal('3')
one_third == +one_third
"""
collections.Counter문서를 보았을 때, Counter 클래스는 Counter 객체의 합꼐를 구하는 중위 연산자등 여러 산술 연산자를 구현하고, 실제로 카운터는 음수가 될 수 없으므로, Counter의 덧셈은 음수나 0인 카운터를 버린다.
"""
ct = Counter('abracadabra')
ct