객체 내용을 변경하는 연산자를 보여주기 위해서 BingoCage 클래스를 확장해서 add와 iadd()를 구현(새로운 서브클래스: AddableBingoCage)
#AddabieBingoCage객체 사용법
vowels = 'AEIOU'
globe = AddableBingoCage(vowels)
globe.inspect()
globe.pick() in vowels
len(globe.inspect())
globe2 = AddableBingoCage("XYZ")
globe3 = globe + globe2
len(globe3.inspect())
void = globe + [10,20]
AddableBingoCage는 가변형이다.
#+=연산자를 사용해서 기존 AddabieBingoCage 객체에 항목 추가
globe_orig = globe
len(globe.insepct())
globe += globe2
len(globe.inspect())
globe += ['M', 'N']
len(globe.inspect()))
globe is globe_orig
globe +=1
두 번째 피연산자의 측면에서 보면 += 연산자가 + 연산자보다 자유로우므로, +연산자의 경우 서로 다른 자료형을 받으면 결과가 어떤 자료형이 되어야 하는지 혼란스러울 수 있고, 양쪽 피연산자가 동일한 자료형이길 원하므로 += 연산자의 경우에는 이런 혼란이 없고, 왼쪽 객체의 내용이 갱신되므로 연산 결과 자료형이 명확하다.
import itertools
from tombola import Tombola
from bingo import BingoCage
class AddableBingoCage(BingoCage):
def __add__(self, other):
if isinstance(other, Tombola):
return AddableBingoCage(self.inspect() + other.inspect())
else:
return NotImplemented
def __iadd__(self, other):
if isinstance(other, Tombola):
other_iterable = other.inspect()
else:
try:
other_iterable = iter(ohter)
except TypeError:
self_cls = type(self).__name__
msg = "right operand in += must be {!r} or an iterable"
raise TypeError(msg.format(self_cls))
self.load(other_iterable)
return self