Generic Type
A type that can be parameterized; typically a container class such as list or dict.
Used for type hints and annotations.
파이썬 공식문서에서 는 generic type 을 위와 같이 설명하고 있다. 파이썬 내에서 Generic type class 는 type 을 파라미터화하여, 인자로 받을 수 있다. 인자로 받은 type 을 공유하는 지역변수 간에는 동일한 type 으로 표시될 수 있다. 이는 type hint와 annotation 을 위해 사용된다.
아래 예시를 보자. Robot class 를 정의할 때 T
, K
라는 2개의 type 을 인자로 받는 Generic type 을 상속받는다. 이 때 T
, K
는 int, float, str 중 하나에 해당하는 type alias 이다. Generic 과 type alias 사용을 통해 우리는 Robot 의 객체를 정의할 때 T
, K
에 어떤 type 을 대입할지 대괄호 내에 넣어준다( Robot[int, int](12231413, 23908409)
). 이것이 가능한 이유는 special method 인 __class_getitem__()
이 Generic class 내에 구현되어 있기 때문에 이를 상속받는 class 또한 type 인자를 대괄호 (square brackets) 로 받을 수 있는 것이다. 해당 스페셜 메소드는 오로지 Generic type 을 위해 구현된 메소드라고 파이썬 문서에 나와 있다(__class_getitem__()
)
from typing import Union, Optional, TypeVar, Generic
T = TypeVar("T", int, float, str)
K = TypeVar("K", int, float, str)
class Robot(Generic[T, K]):
def __init__(self, arm_strength: T, head: K):
self.arm = arm
self.head = head
def set_arm_strength (self):
# self.arm_strength 와 같은 type로 표시 (T)
self.left_arm: T = self.arm_strength
self.right_arm: T = self.arm_strength
# Generic[T, K] 상속으로 인한 type 대입 (대괄호)
robot1 = Robot[int, int](12231413, 23908409)
robot2 = Robot[str, int]("12890309123", 79878789)
robot3 = Robot[float, str](1239.01823, "3243245")
self.set_arm_strength()
메소드에서도 객체 생성 시 T 에 대입한 type 을 동일하게 self.left_arm
과 self.right_arm
이 가지는 것으로 표시된다.
class Siri(Robot[T, K]):
pass
# Robot[T, K] 상속으로 인한 type 대입
siri1 = Siri[int, int](1, 2)
siri2 = Siri[str, int]("1289", 3)
siri3 = Siri[float, str](1239.01823, "324")
print(siri1.arm, type(siri1.arm)) # 1 int
Generic 을 상속받은 다른 class 를 상속받는 하위 class 의 객체를 정의할 때도 마찬가지로 인자에 해당하는 type을 대입하는 것이 필요하다.
<Reference>
https://docs.python.org/ko/3/glossary.html#term-generic-type
https://docs.python.org/ko/3/library/stdtypes.html#types-genericalias
https://docs.python.org/ko/3/reference/datamodel.html#object.__class_getitem__
Mix-in Class (0) | 2022.05.25 |
---|---|
Duck typing 과 Nominative typing, Structure typing (0) | 2022.05.25 |
Type Annotation (8) - Final Type (0) | 2022.05.23 |
Type Annotation (7) - Type alias (0) | 2022.05.23 |
Type Annotation (6) - Class (0) | 2022.05.23 |
댓글 영역