타입 검사

Python SELF KO
레벨 16 , 레슨 3
사용 가능

9.1 type() 함수

파이썬에는 객체의 타입과 클래스를 검사하기 위한 몇 가지 기본 내장 함수들이 있어. 이런 함수들은 다양한 데이터 타입과 함께 작동할 수 있는 유연하고 안전한 코드를 작성하는 데 유용해.

여기에서는 그 중 가장 인기 있는 것들인 type(), isinstance(), issubclass() 그리고 getattr()hasattr() 같은 타입 주석용 함수들에 대해 다룰 거야.

type() 함수

type() 함수는 객체의 타입을 반환해. 이 함수랑 벌써 작업해봤지, 그렇지 않아?


x = 10
print(type(x))  # 출력: <class 'int'>

하지만 이걸로 새로운 클래스를 생성할 수 있다는 건 아마 몰랐을 거야!

새로운 클래스 생성

이 함수에 세 개의 인수를 전달하면 새로운 타입(클래스)을 생성할 수 있어.

이 작업의 시그니처는 다음과 같아:


type(name, bases, dict)

여기서:

  • name — 생성할 클래스의 이름 (문자열).
  • bases — 새로운 클래스가 상속받을 기본 클래스(부모 클래스)들의 튜플.
  • dict — 새로운 클래스의 속성과 메서드를 담고 있는 딕셔너리.

간단한 클래스 생성:


MyClass = type('MyClass', (), {'say_hello': lambda self: print("Hello!")})

# 클래스 인스턴스 생성
instance = MyClass()
instance.say_hello()  # 출력: Hello!

좀 더 복잡한 것도 만들 수 있어:


MyClass = type('MyClass', (), {
    'attribute': 42,
    '__init__': lambda self, value: setattr(self, 'value', value),
    'display_value': lambda self: print(self.value)
})
            
# 클래스 인스턴스 생성
instance = MyClass(10)
print(instance.attribute)  # 출력: 42
instance.display_value()  # 출력: 10

이제 객체의 타입을 확인하는 것뿐만 아니라, 클래스를 만들고, 그 객체들을 생성하고, 그 타입을 확인할 수 있게 되었어.

9.2 isinstance() 함수

isinstance() 함수는 파이썬에서 객체가 특정 클래스 또는 클래스들의 튜플에 속해있는지를 체크하기 위한 내장 함수야. 객체가 지정된 클래스의 인스턴스이거나 튜플 내 어떤 클래스의 인스턴스일 경우 True를 반환하고, 그렇지 않으면 False를 반환해.

시그니처와 매개변수:


isinstance(object, classinfo)

여기서:

  • object — 클래스 또는 클래스들에 속해있는지를 체크할 객체.
  • classinfo — 객체를 체크할 클래스, 타입 또는 클래스 및 타입들의 튜플.

사용 예시:

단일 클래스에 속하는지 확인하기


x = 10
print(isinstance(x, int))  # 출력: True
            
y = "Hello"
print(isinstance(y, str))  # 출력: True

여러 클래스 중 하나에 속하는지 확인하기


x = 10
print(isinstance(x, (int, float)))  # 출력: True
            
y = "Hello"
print(isinstance(y, (int, str)))  # 출력: True
            
z = 3.14
print(isinstance(z, (int, str)))  # 출력: False

사용자 정의 클래스에 속하는지 확인하기


class Animal:
    pass
        
class Dog(Animal):
    pass
        
dog = Dog()
        
print(isinstance(dog, Dog))  # 출력: True
print(isinstance(dog, Animal))  # 출력: True

type()를 이용한 직접적인 타입 비교와 달리, isinstance()는 상속과 관련하여 정확하게 작동하며 객체가 계층 구조 내의 어떤 클래스에도 속하는지를 검사해.

9.3 issubclass() 함수

issubclass() 함수는 파이썬에서 특정 클래스가 다른 클래스의 하위 클래스인지, 아니면 클래스들의 튜플 중 하나의 하위 클래스인지를 확인하는 데 사용되는 내장 함수야. 첫 번째 인수가 두 번째 인수의 하위 클래스일 경우, 이 함수는 True를 반환하고, 그렇지 않으면 False를 반환해.

시그니처와 매개변수:


issubclass(class, classinfo)

여기서:

  • class — 해당 클래스 또는 클래스들의 하위 클래스인지 검사할 클래스.
  • classinfo — 첫 번째 인수를 검사할 클래스, 타입 또는 클래스 및 타입들의 튜플.

사용 예시:

단일 클래스에 속하는지 확인하기



class Animal:
    pass
         
class Dog(Animal):
    pass
        
print(issubclass(Dog, Animal))  # 출력: True
print(issubclass(Animal, Dog))  # 출력: False 

여러 클래스 중 하나에 속하는지 확인하기


class Animal:
    pass
        
class Dog(Animal):
    pass
        
class Cat(Animal):
    pass
        
print(issubclass(Dog, (Animal, Cat)))  # 출력: True
print(issubclass(Dog, (Cat,)))  # 출력: False

사용자 정의 클래스 예시

내장 클래스에서 상속받기


class MyInt(int):
    pass
        
print(issubclass(MyInt, int))  # 출력: True
print(issubclass(int, MyInt))  # 출력: False

상속 계층 구조


class A:
    pass
        
class B(A):
    pass
        
class C(B):
    pass
        
print(issubclass(C, A))  # 출력: True
print(issubclass(C, B))  # 출력: True
print(issubclass(B, A))  # 출력: True
print(issubclass(A, C))  # 출력: False

issubclass() 사용의 장점

클래스 계층 구조 확인: issubclass()는 클래스 계층 구조를 확인할 수 있어, 올바른 상속 및 코드 구조를 보장하는 데 유용하지.

유연성: 이 함수는 하나의 클래스 또는 클래스들의 튜플을 검사할 수 있으며, 다양한 시나리오에서 사용하기에 유연해.

메타프로그래밍에 편리함: issubclass()는 메타프로그래밍이나 동적 타입 및 클래스 작업 코드 작성에 자주 사용돼. 이런 것들은 우리가 나중에 더 다룰 거야 :)

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION