상세 컨텐츠

본문 제목

Type Annotation (9) - Generic Type

개발/python-객체지향프로그래밍(OOP)

by Matthew0633 2022. 5. 25. 23:49

본문

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_armself.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__

관련글 더보기

댓글 영역