파이썬의 isinstance 함수에 대해 알아봅시다.

 


 isinstance(obj, class)은 obj가 class instance인지, 혹은 class의 subclass instance인지를 검사합니다. 뭔가 좀 어려워 보이는데요. 쉽게 말해 객체가 동물 instance인지, 아닌지를 검사할 때 쓰일 수 있는 함수입니다. 예를 하나 들어보겠습니다.

 

 

 Parent 클래스하고 Child 클래스가 있습니다. Child는 Parent를 상속받고 있습니다. 이를 그림으로 그리면 아래와 같습니다.

 

 

 이제, 예제를 보겠습니다.

 

 

 par는 Parent 객체입니다. 그리고 child는 Child 객체입니다. 12번째 줄부터 볼까요? child가 Parent instance는 아니지만, Parent를 상속받는 Child의 instance입니다. 따라서, 12번째 줄의 결과값은 True가 됩니다. 반면, par는 Parent의 instance입니다. 이것은 Child를 상속받지 않기 때문에, 13번째 줄의 결과값은 거짓이 됩니다. 11번째 줄은 참입니다. 왜냐하면, par는 Parent 인스턴스이기 때문입니다.

 

 이를 그림으로 그리면 위와 같습니다.

 

 

 그리고 프로그램의 결과는 위와 같습니다. Parent가 Child의 subclass가 아니기 때문에 3번째의 경우, False가 출력되었습니다.

 

 


 이제 다른 예제를 보도록 합시다. Grand class가 있습니다. Grand를 Parent가 상속을 받고, Parent를 Child가 상속받는군요?

 

 

 다이어그램은 대략 이런 식으로 그려질 겁니다.

 

 

16번째 줄의 결과는 어떻게 나올까요? 일단, 2번째 인자로 Class 대신 무언가의 튜플로 받았습니다. isinstance(par, (A, B))는 문서에 따르면, isinstance(par, A)이거나, isinstance(par, B)이냐를 검사하는 것과 동일하다고 되어 있습니다. 고로, 위 코드에서는 par가 Child의 인스턴스 or subclass 이거나, Grand의 인스턴스 or subclass 인지를 물어보는 것과 같습니다.

 

 일단 parent는 Parent 인스턴스입니다. Parent는 Grand, Child의 인스턴스는 아닙니다. 그러면, Grand의 subClass이거나, Child의 SubClass일까요? 네. 왜냐하면, Grand를 상속받는 클래스가 Parent이기 때문입니다.

 

 

 따라서 결과는 True가 나옵니다. 또 다른 질문. 이건 어떨까요?

 

 

 isinstance의 1번째 인자에 Child, 2번째 인자에 Grand가 들어갔습니다. 결과가 True가 나올 거 같지만, False가 나옵니다. type을 찍어보면 그 이유를 알 수 있는데요.

 

 

 Child는 class 'type'이기 때문입니다. 이 'type'은 Grand에서 derived 된 것이 아니기 때문에 False를 반환합니다. 이제, 이건 어떨까요?

 

 

 child가 Grand 인스턴스이거나 Grand에서 derived된 인스턴스인지를 검사하는데요. Grand를 상속받는 것이 Parent고 Parent를 상속받는 것이 Child이므로, Child는 Grand에서 파생된 것임을 알 수 있어요. child는 Child의 인스턴스이므로 참이겠네요. 더 쉽게 비유를 하자면, Animal이라는 클래스를 상속받는 게 Dog이고, Dog를 상속받는 것이 Maltise라고 합시다. 그러면, Maltise는 Animal일 거고, Maltise는 Animal로부터 파생된 무언가입니다. Animal을 Grand로, Dog를 Parent로, Maltise를 Child 클래스로 대응시키면 이해하기 쉬울 겁니다.