시퀀스처럼 작동하는 클래스가 있다면 shuffle()메서드를 직접 구현할 필요가 없다. 왜냐하면, random.shuffle()함수 문서에서 설명하는 것처럼 random.shuffle()함수가 시퀀스 객체 안의 항목들을 섞어주기 때문이다.
from random import shuffle
l = list(range(10))
shuffle(l)
#random.shuffle()이 FrenchDeck 처리 못한다.
from random import shuffle
from frenchdeck import FrenchDeck
deck = FrenchDeck()
shuffle(deck)
'FrenchDeck'객체가 할당을 지원하지 않고, shuffle()함수는 컬렉션 안의 항목들을 교환시키고, FrenchDeck 클래스는 불변 시퀀스 프로토콜만 구현하고 있고, 가변 시퀀스는 setitem() 메서드도 지원
#FrenchDeck을 가변형으로 만들어 random.shuffle()을 사용
def set_card(deck, position, card):
deck._cards[position] = card
FrenchDeck.__setitem__ = set_card
shuffle(deck)
첫 번째 매개변수로 self를 사용하는 것은 관례이지만 콘솔 세션에선 이렇게 해도 괜찮지만 파이썬 소스 파일에선 문서화된 대로 self, key,value를 매개변수로 사용하는 것이 좋다.
deck객체에 _cards라는 이름의 속성이 있고, _cards가 가변 시퀀스임을 set_card()가 알고 있고난 후에 set_card()함수가 FrenchDeck클래스의 setitem특별 메서드에 연결되고 이를 멍키 패칭이다.