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()
는 메타프로그래밍이나 동적 타입 및 클래스 작업 코드 작성에 자주 사용돼. 이런 것들은 우리가 나중에 더 다룰 거야 :)
GO TO FULL VERSION