Collections.MutableSequence활용하기
import collections
Card = collections.namedtuple("Card", ['rank', 'suit'])
class FrenchDeck2(collections.MutableSequence):
ranks = [str(n) for n in range(2,11)] + list("JQKA")
suits = 'spades diamonds clubs hearts'.split()
def __init__(self):
self._cards = [Card(rank, suit) for suit in self.suits
for rank in self.ranks]
def __len__(self):
return len(self._cards)
def __getitem__(self, position):
return self._cards[position]
def __setitem__(self, position, value):
self._cards[position] = value
def __delitem__(self, position):
del self._cards[position]
def insert(self, position, value):
self._cards.insert(position, value)
파이썬은 모듈을 로딩하거나 컴파일할 때가 아니라 실행 도중 실제로 FrenchDeck2 객체를 생성할 때 추상 메서드의 구현 여부를 확인하여 추상 메서드 중 하나라도 구현되어 있지 않으면 생성할 수 없다라는 메시지와 TypeError발생한다.
구현한 FrenchDeck2 예제에서 사용되지 않은 delitem()과 inset() 메서드를 구현해야 하므로 MutableSequence ABC가 요구하는 사항이다.
FrenchDeck2는 Sequence로부터 contains(), iter(), reversed(), index(), count()와 같은 바로 사용할 수 있는 메서드를 상속하여 MutablSequence 클래스로부터 append(), reverse(), extend(), pop(), remove(), iadd()메서드를 상속한다.