Generic Type

codakcodak·2023년 10월 15일
0

OOP python

목록 보기
13/19
post-thumbnail
post-custom-banner

Genric Type

  • 하나의 데이터 형식에 의존하지 않고,여러 다른 데이터 타입들을 가질 수 있게하는 기술

  • 컴파일 시 강한 타입 체크를 할 수 있다.
    (외부에서 사용하는 시점에 타입을 정의해 주기 때문에 코드의 흐름을 미리 정하고 예측할 수 있다.)

  • 타입 변환을 제거한다.
    (object를 반환하는 api같은 경우 형변환을 해줘야 했지만 미리 타입을 명시하면 원하는 자료형으로 바로 받을 수 있다.)

기본사용

  • class
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'>
  • function
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'>
profile
숲을 보는 코더
post-custom-banner

0개의 댓글