단항 연산자는 self 인수 하나를 받는 적절한 특별 메서드를 구현하기에ㅔ 쉽다. 물론, 클래스에 논리적으로 합당한 연산을 수행해야 하므로 self를 수정하지 말고 적절한 자료형의 객체를 새로 생성해서 반환해야 한다.
단적으로, +와-인 경우 결과는 아마도 self와 같은 클래스의 객체로 +의 경우 일반적으로 self의 사본을 반환하는 것이 좋다.
abs()의 경우 스칼라형 숫자가 결과로 나온다.
~의 경우 정수이외의 피연산자에 적용한다면 어떤 값이 나와야 하는지 확답하기 어렵고, ORM에서 ~를 사용하면 SQL의 WHERE 구를 부정한 결과를 반환하는 것이 타당하다.
#vector_v6.py: 단항 연산자 - 와 + 추가
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 연산을 실행하면 파이썬은 단항 연산자 ~에 맞지 않는 피연산자라는 것을 의미하는 'bad operand type for unary ~: 'Vector"."메시지와 함께 TypeError가 발생한다.
#산술 콘텍스트의 정밀도를 변경하면 x와 +x가 달라질 수 있다.
import decimal
ctx = decimal.getcontext()
ctx.prec = 40
one_third = decimal.Decimal('1') / decimal.Decimal('3')
one_third == +one_third
ctx.prec = 28
one_third == +one_third
+one_third
#단항 연산자 +는 합계가 0이 아닌 음수인 항목을 제외하고 Counter 객체를 새로 생성한다.
ct = Counter('abracadabra')
ct