Post

[Py: Class] 3.isinstance 함수와 object 클래스


isinstance 함수

  • isinstance함수는 객체의 클래스 유형을 확인하는 함수이다.
    즉, “이 객체는 저 class에 의해서 생성된 객체인가?”라는 질문에 대한 답을 해주는 함수이다.

    1
    
    isinstance(object, classinfo)
    


  • 다음의 예시와 같이 object에 위치한 객체의 class가 classinfo에 위치한 class와 동일하다면 True를 반환한다.

    1
    2
    3
    4
    5
    6
    7
    
    class simple:
        pass
      
    s = simple()
      
    print(isinstance(s, simple)) # s라는 객체의 클래스 유형은 simple인가?, True
    print(isinstance([1,2], list)) # [1,2]의 객체는 클래스 유형은 list인가?, True
    


  • 상속 관계가 있는 다음의 경우에도 True를 반환한다!
    아래의 코드에서 class C는 class B에 의해서 class A를 간접 상속한다. (간접 상속도 상속이다!)
    따라서, isinstance상속/간접상속 관계가 있는 경우True를 반환함을 알 수 있다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    class A:
        pass
    
    class B(A):
        pass
    
    class C(B):
        pass
    
    s = C()
    print(isinstance(s, C)) # True
    print(isinstance(s, B)) # True
    print(isinstance(s, A)) # True
    



object 클래스

  • object클래스는 파이썬에서 모든 클래스의 시작점이다. 왜냐하면 파이썬의 모든 클래스는 object클래스를 직접/간접 상속</u>하기 때문이다. 따라서, object 클래스는 최상위 수준에 있으며, 모든 기본적인 메서드와 속성을 제공한다.
  • 다음은 list객체 내에 object객체의 메서드 모두 포함되어있는지 확인하는 코드이다. object 객체는 총 23개의 메서드를 가지고 있으며, 해당 메서드들이 모두 list객체에 포함되어있는 것을 확인할 수 있다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    from collections import Counter
    
    s = object()
    object_method_lists = dir(object)
    list_method_lists = dir(list)
    
    answer = []
    
    for object_method_list in object_method_lists:
        answer.append(True) if object_method_list in list_method_lists else answer.append(False)
    
    print(f'object객체의 메서드 수: {len(object_method_lists)}') # 23
    print(f'list객의 메드 수: {len(list_method_lists)}') # 47
    print(Counter(answer)) # Counter({True: 23})
    


  • 더불어, object클래스의 상속을 명시하지 않아도 파이썬이 object를 직접 혹은 간접 상속하도록 클래스를 구성하기 때문에 모든 클래스의 객체를 생성하는데 일조하는 type까지 object class를 상속하는 것을 확인할 수 있다.

    1
    2
    3
    4
    5
    6
    
    class simple:
        pass
      
    print(isinstance(simple, object)) # True
    print(isinstance([1, 2], object)) # True
    print(isinstance(type, object))   # True 
    


  • typeobject에 관해서 정리하자면,
    • 모든 객체는 클래스의 인스턴스이다.
    • object를 포함한 모든 클래스는 type의 인스턴스이다.
    • type을 포함한 모든 클래스는 object를 상속한다.
    • 즉, typeobject의 서브클래스이며, objecttype의 인스턴스로 특별한 순환 관계를 갖고 있다.
    1
    2
    3
    
    print(isinstance(object, type))  # True
    print(isinstance(type, type))    # True
    print(issubclass(type, object))  # True
    



References

  • 윤성우, 『윤성우의 열혈 파이썬 중급편』, ORANGE MEDIA(2021)
This post is licensed under CC BY 4.0 by the author.