Python 에서 객체가 클래스의 인스턴스인지 확인하는 방법

PythonBeginner
지금 연습하기

소개

이 랩에서는 Python 의 클래스와 인스턴스를 탐구하고, 객체가 클래스의 인스턴스인지 확인하는 방법을 배웁니다. 먼저 클래스 및 인스턴스 속성을 가진 Dog 클래스를 생성하는 것으로 시작합니다. 그런 다음 Dog 클래스의 인스턴스를 생성하고 해당 속성에 접근합니다.

그 후, 타입 검사를 위해 isinstance()를 사용하는 방법을 배우고, 정확한 일치를 위해 type()과 비교합니다. 이를 통해 객체가 특정 클래스 또는 해당 클래스의 서브클래스에 속하는지 여부를 결정할 수 있으며, Python 에서 객체 지향 프로그래밍에 대한 더 깊은 이해를 제공합니다.

클래스와 인스턴스 탐구

이 단계에서는 Python 의 클래스와 인스턴스에 대해 배웁니다. 클래스는 객체를 생성하기 위한 청사진과 같으며, 인스턴스는 해당 청사진에서 생성된 실제 객체입니다. 클래스와 인스턴스를 이해하는 것은 Python 에서 객체 지향 프로그래밍의 기본입니다.

먼저, Dog라는 간단한 클래스를 생성해 보겠습니다.

  1. LabEx 환경에서 VS Code 편집기를 엽니다.

  2. ~/project 디렉토리에 dog.py라는 새 파일을 생성합니다.

    ~/project/dog.py
  3. dog.py에 다음 코드를 추가합니다.

    ## Define a class called Dog
    class Dog:
        ## Class attribute
        species = "Canis familiaris"
    
        ## Instance attribute
        def __init__(self, name, age):
            self.name = name
            self.age = age

    여기서 Dog라는 클래스를 정의합니다. species는 클래스 속성으로, Dog 클래스의 모든 인스턴스에서 공유됩니다. __init__ 메서드는 생성자라고 불리는 특수한 메서드입니다. 새로운 Dog 객체가 생성될 때 인스턴스 속성 nameage를 초기화하는 데 사용됩니다.

  4. 이제 Dog 클래스의 인스턴스를 생성해 보겠습니다. dog.py의 끝에 다음 코드를 추가합니다.

    ## Create instances of the Dog class
    buddy = Dog("Buddy", 9)
    miles = Dog("Miles", 4)
    
    ## Access instance attributes
    print(f"{buddy.name} is {buddy.age} years old.")
    print(f"{miles.name} is {miles.age} years old.")
    
    ## Access class attribute
    print(f"{buddy.name} is a {buddy.species}.")
    print(f"{miles.name} is a {miles.species}.")

    이 부분에서는 Dog 클래스의 두 인스턴스인 buddymiles를 생성합니다. 그런 다음 점 표기법 (.) 을 사용하여 인스턴스 속성 (nameage) 과 클래스 속성 (species) 에 접근합니다.

  5. dog.py 스크립트를 실행하려면 VS Code 에서 터미널을 열고 다음 명령을 실행합니다.

    python dog.py

    다음 출력을 볼 수 있습니다.

    Buddy is 9 years old.
    Miles is 4 years old.
    Buddy is a Canis familiaris.
    Miles is a Canis familiaris.

    이 출력은 Dog 클래스의 인스턴스를 성공적으로 생성하고 해당 속성에 접근했음을 확인합니다.

isinstance() 를 사용한 타입 검사

이 단계에서는 Python 에서 객체가 특정 클래스의 인스턴스인지 확인하기 위해 isinstance() 함수를 사용하는 방법을 배웁니다. 이는 코드가 다양한 유형의 객체를 올바르게 처리하도록 보장하는 데 유용한 도구입니다.

이전 단계의 Dog 클래스를 기반으로, isinstance()를 탐구하기 위해 새로운 Python 파일을 생성해 보겠습니다.

  1. LabEx 환경에서 VS Code 편집기를 엽니다.

  2. ~/project 디렉토리에 type_check.py라는 새 파일을 생성합니다.

    ~/project/type_check.py
  3. dog.py에서 Dog 클래스 정의를 복사하여 type_check.py에 붙여넣습니다. 이제 type_check.py 파일은 다음과 같아야 합니다.

    class Dog:
        species = "Canis familiaris"
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
  4. 이제 isinstance() 함수를 사용하기 위한 코드를 추가해 보겠습니다. type_check.py의 끝에 다음 코드를 추가합니다.

    ## Create instances of the Dog class
    buddy = Dog("Buddy", 9)
    miles = Dog("Miles", 4)
    
    ## Check if buddy is an instance of the Dog class
    print(isinstance(buddy, Dog))
    
    ## Check if miles is an instance of the Dog class
    print(isinstance(miles, Dog))
    
    ## Check if a string is an instance of the Dog class
    print(isinstance("Hello", Dog))

    여기서는 Dog 클래스의 두 인스턴스인 buddymiles를 생성합니다. 그런 다음 isinstance() 함수를 사용하여 이러한 인스턴스가 Dog 타입인지 확인합니다. 또한 문자열 "Hello"가 Dog 클래스의 인스턴스인지 확인합니다.

  5. type_check.py 스크립트를 실행하려면 VS Code 에서 터미널을 열고 다음 명령을 실행합니다.

    python type_check.py

    다음 출력을 볼 수 있습니다.

    True
    True
    False

    출력은 buddymiles가 실제로 Dog 클래스의 인스턴스이고, 문자열 "Hello"는 그렇지 않음을 보여줍니다.

정확한 일치를 위해 type() 과 비교

이 단계에서는 Python 에서 type() 함수를 사용하고 타입 검사를 위해 isinstance()와 비교하는 방법을 배웁니다. isinstance()는 객체가 클래스 또는 서브클래스의 인스턴스인지 확인하는 반면, type()은 객체의 정확한 타입을 반환합니다.

차이점을 설명하기 위해 Dog 클래스의 서브클래스를 생성한 다음 isinstance()type()을 모두 사용하여 인스턴스의 타입을 확인해 보겠습니다.

  1. LabEx 환경에서 VS Code 편집기를 엽니다.

  2. ~/project 디렉토리에서 type_check.py 파일을 수정합니다.

    ~/project/type_check.py
  3. Dog 클래스에서 상속받는 GermanShepherd라는 새 클래스를 추가합니다. 이제 type_check.py 파일은 다음과 같아야 합니다.

    class Dog:
        species = "Canis familiaris"
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    class GermanShepherd(Dog):
        def __init__(self, name, age, training_level):
            super().__init__(name, age)
            self.training_level = training_level

    여기서 GermanShepherdDog의 서브클래스입니다. Dog 클래스에서 nameage 속성을 상속받고 새로운 속성 training_level을 추가합니다.

  4. 이제 isinstance()type() 함수를 사용하기 위한 코드를 추가해 보겠습니다. type_check.py의 끝에 다음 코드를 추가합니다.

    ## Create instances of the Dog and GermanShepherd classes
    buddy = Dog("Buddy", 9)
    sparky = GermanShepherd("Sparky", 3, "Advanced")
    
    ## Check types using isinstance()
    print(f"buddy isinstance Dog: {isinstance(buddy, Dog)}")
    print(f"sparky isinstance Dog: {isinstance(sparky, Dog)}")
    print(f"sparky isinstance GermanShepherd: {isinstance(sparky, GermanShepherd)}")
    
    ## Check types using type()
    print(f"type(buddy) == Dog: {type(buddy) == Dog}")
    print(f"type(sparky) == Dog: {type(sparky) == Dog}")
    print(f"type(sparky) == GermanShepherd: {type(sparky) == GermanShepherd}")

    이 부분에서는 Dog 클래스의 인스턴스 (buddy) 와 GermanShepherd 클래스의 인스턴스 (sparky) 를 생성합니다. 그런 다음 isinstance()type()을 사용하여 해당 타입을 확인합니다.

  5. type_check.py 스크립트를 실행하려면 VS Code 에서 터미널을 열고 다음 명령을 실행합니다.

    python type_check.py

    다음 출력을 볼 수 있습니다.

    buddy isinstance Dog: True
    sparky isinstance Dog: True
    sparky isinstance GermanShepherd: True
    type(buddy) == Dog: True
    type(sparky) == Dog: False
    type(sparky) == GermanShepherd: True

    출력은 isinstance(sparky, Dog)True를 반환하는 것을 보여줍니다. 왜냐하면 sparkyDog의 서브클래스인 GermanShepherd 클래스의 인스턴스이기 때문입니다. 그러나 type(sparky) == DogFalse를 반환합니다. 왜냐하면 type(sparky)는 정확한 타입인 GermanShepherd를 반환하고 Dog를 반환하지 않기 때문입니다.

요약

이 랩에서는 Python 에서 클래스와 인스턴스의 기본 사항을 탐구했습니다. 클래스 속성과 __init__ 생성자 내에서 초기화된 인스턴스 속성을 포함하여 클래스를 정의하는 방법을 배웠습니다.

그런 다음 Dog 클래스의 인스턴스를 생성하고 특정 속성에 값을 할당했습니다. 마지막으로, 점 표기법을 사용하여 인스턴스 속성 (이름, 나이) 과 클래스 속성 (종) 모두에 접근하여 객체 및 해당 클래스와 관련된 정보를 검색하는 방법을 시연했습니다.