런타임에 프로토콜을 구현하는 멍키 패칭

매일 공부(ML)·2023년 1월 28일
0

Fluent Python

목록 보기
74/130

객체지향 상용구

인터페이스:프로트콜에서 ABC까지

런타임에 프로토콜을 구현하는 멍키 패칭

시퀀스처럼 작동하는 클래스가 있다면 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특별 메서드에 연결되고 이를 멍키 패칭이다.

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

0개의 댓글