Genric Type
하나의 데이터 형식에 의존하지 않고,여러 다른 데이터 타입들을 가질 수 있게하는 기술
컴파일 시 강한 타입 체크를 할 수 있다.
(외부에서 사용하는 시점에 타입을 정의해 주기 때문에 코드의 흐름을 미리 정하고 예측할 수 있다.)
타입 변환을 제거한다.
(object를 반환하는 api같은 경우 형변환을 해줘야 했지만 미리 타입을 명시하면 원하는 자료형으로 바로 받을 수 있다.)
기본사용
from typing import Union, Optional, TypeVar, Generic
T = TypeVar("T", int, str, float) # generic의 타입들의 범위를 정할 수 있다.
K = TypeVar("K", str, int)
class Robot(Generic[T, K]):
def __init__(self, arm: T, head: K): # arm은 string or int형이다!
self.arm = arm
self.head = head
def decode(self):
# decode arm의 자료형에 따라서 로직이 유연하게 돌아가야한다!
key: T = self.arm # arm의 형태가 여러가지 일 수 있으므로 key도 여러가지 일 수 있다!
print(type(key))
# arm의 자료형과 동일하게 설정하는 기능이 필요하다.
pass
robot1 = Robot[int, int](123, 1111)
robot1.decode()
robot2 = Robot[str, int]("2345", 2222)
robot2.decode()
robot3 = Robot(3456.222, "3333") # generic을 명시하지 않으면 자동으로 변수의 자료형을 따라간다.
robot3.decode()
<class 'int'>
<class 'str'>
<class 'float'>
from typing import Union, Optional, TypeVar, Generic
T = TypeVar("T", int, str, float) # generic의 타입들의 범위를 정할 수 있다.
def test(x: T) -> T:
print(x)
print(type(x))
return x
test(1)
1
<class 'int'>
from typing import Union, Optional, TypeVar, Generic
T = TypeVar("T", int, str, float) # generic의 타입들의 범위를 정할 수 있다.
K = TypeVar("K", str, int)
class Test:
pass
class Siri(Generic[T, K], Robot[T, K]):
pass
siri1 = Siri[int, int](123, 1111)
siri2 = Siri[str, int]("2345", 2222)
siri3 = Siri[float, str](3456.222, "3333")
print(siri1.arm)
print(type(siri1.arm))
123
<class 'int'>