복합 할당 연산자

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

Fluent Python

목록 보기
91/130

객체지향 상용구

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

복합 할당 연산자

객체 내용을 변경하는 연산자를 보여주기 위해서 BingoCage 클래스를 확장해서 addiadd()를 구현(새로운 서브클래스: 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

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

0개의 댓글