[Python] type보다 명확한 isinstance

글쓴이 Engineer Myoa 날짜

type은 객체가 실질적으로 생성한 클래스의 정보를 보여줍니다.

가장 간단하면서, 확실하게 객체 타입을 알아낼 수 있습니다.

객체 타입 비교또한

>>> int == type(123)
True

위처럼 간단하게 끝낼 수 있습니다.

 

하지만 상속관계가 낀다면 얘기가 달라집니다.

클래스 Foo와 클래스 Bar(Foo)가 존재할 때,

>>> b= Bar()

>>> type(b) == Bar # b는 Bar를 할당한 객체이다.
True

>>> type(b) == Foo # 그렇기 때문에 b는 근본적으로 Foo가 되진 않는다.
False

>>> Foo == Bar # Bar는 Foo를 상속받은 클래스지만 Foo != Bar 이기 때문이다.
False

위와 같은 상황에서는 type으로 상속관계를 확인할 수 없습니다.

따라서 이 때, isinstance 함수를 이용하게 됩니다.

isintance(object, classinfo)

classinfo : A class, Type or tuple containing Classes.

어떤 객체를 비교할 때 type처럼 어떤 클래스나, Type과 비교할 수 있습니다.

뿐만 아니라 클래스들을 담고있는 tuple객체와도 비교가 가능합니다. (bool값을 return하기 때문에 당연히 tuple안의 모든 클래스와 같아야합니다.)

>>> b = Bar()

>>> isinstance(b, Foo) # type(Foo) != b 이지만 b는 Foo를 상속받은 Bar의 클래스이기 때문에 instance정보가 일치한다.
True

>>> isinstance(b, Bar) # 당연한 사실
True

>>> isinstance(Bar, Foo) # Bar와 Foo 클래스는 다른 클래스다.
False

>>> isinstance(Bar(), Foo) # 하지만 Bar를 인스턴스화 한 Bar()는 Foo와 일치한다.
True


>>> isinstance(b, (Foo, Bar, Foo(), Bar())) # tuple로 classinfo 인자를 넘긴 경우
True

 

이런 결과가 도출되는 이유는, isinstance의 함수 설명을 읽어보면 알 수 있습니다.

Returns a Boolean stating whether the object is an instance or subclass of another object.

특정객체가 다른 객체의 인스턴스이거나, 하위 클래스 객체인지의 여부를 Boolean으로 반환합니다.

이를 이용하여, 커스텀 Exception 구조를 만들거나, 상속 구조를 가진 OOP에서 활용이 가능합니다.

 

참고문헌

https://python-reference.readthedocs.io/en/latest/docs/functions/isinstance.html


43개의 댓글

답글 남기기

Avatar placeholder

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다