더북(TheBook)

18.10 디버깅

메서드를 객체에서 호출하기 때문에 상속을 이용하면 어느 메서드가 호출되었는지 알기 어려울 수 있고, 그 결과 디버깅도 어려워질 수 있다.

Hand 객체를 사용하는 함수를 작성한다고 해보자. PokerHands, BridgeHands 같은 종류의 Hand 객체 모두와 동작하고 싶을 것이다. shuffle 같은 메서드를 호출한다면 Deck에 정의된 것을 호출하게 될 것이고, 서브클래스에서 이 메서드를 재정의한다면 재정의된 버전을 호출하게 될 것이다. 이러한 동작은 일반적으로 바람직하지만, 혼란스러울 수도 있다.

프로그램의 실행 흐름이 확실하게 이해가 되지 않을 때는 관련된 메서드의 시작 부분에 print 문을 추가하는 것이 가장 쉬운 해결책이다. Deck.shuffleRunning Deck.shuffle 같은 메시지를 출력한다면 프로그램이 실행될 때 실행 흐름을 추적할 수 있다.

다른 방법으로는 객체와 메서드 이름을 받아서 메서드를 정의한 클래스를 반환하는 함수를 사용하는 것이다.

def find_defining_class(obj, meth_name):

for ty in type(obj).mro():

if meth_name in ty._ _dict_ _:

return ty

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