더북(TheBook)

사용 예는 다음과 같다.

>>> hand = Hand()

>>> find_defining_class(hand, 'shuffle')

<class 'Card.Deck'>

메시지를 보면 Handshuffle 메서드는 Deck에 정의된 것이다.

find_defining_class는 클래스 객체의 메서드 목록을 가져와 메서드를 검색하기 위해 mro 메서드를 사용한다. MROMethod Resolution Order(메서드 풀이 순서)라는 뜻으로 클래스의 순차열로 되어 있고, 파이썬은 메서드 이름을 풀이(resolve)하기 위해 이를 검색한다.

디자인을 위한 조언: 메서드를 재정의할 때는 새로운 메서드의 인터페이스가 기존 메서드의 인터페이스와 같아야 한다. 같은 인자를 받아야 하고, 같은 타입을 반환해야 하고, 같은 사전 조건과 사후 조건을 따라야 한다. 이러한 규칙을 따른다면 부모 클래스의 인스턴스와 동작하도록 디자인된 메서드는 모두 자식 클래스의 인스턴스와도 동작할 것이다. 즉, Deck 클래스의 메서드는 HandPokerHand 같은 자식 클래스의 인스턴스와도 동작할 것이다.

이러한 규칙을 리스코프 치환 원칙이라고도 하는데, 이를 어긴다면 여러분의 코드는 엉성하게 지은 집처럼 무너지게 될 것이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.