>source

파이썬 일반 유형 클래스의 생성자를 어떻게 사용합니까?

T= typing.TypeVar('T')
class MyClass(typing.Generic[T]):
    def __init__(self, initialValue: typing.Iterable):
        self.values: T= T(initialValue)
test= MyClass[tuple[int]]([1, 2, 3])

이 경우에는T(초기값)와 동등하다튜플(초기값)하지만 대신 오류가 발생합니다. "예외가 발생했습니다: TypeError 'TypeVar' 개체를 호출할 수 없습니다"

입력이 목적이 아니므로 그렇게 놀라운 일은 아니지만 이를 수행할 수 있는 해결 방법이 있습니까?

self.values를 시도하십시오: T= initialValue. T(initialValue)를 수행하여 메서드로 T에서 생성자를 호출하려는 것처럼 보이지만 T는 호출할 수 없기 때문에 존재하지 않습니다. 어쨌든 값에 대한 유형을 선언할 필요가 없는 것 같은데 왜 제네릭 유형이 필요하다고 느끼는가?

EduGord2022-02-14 14:20:47
  • 답변 # 1

    명시적인 팩토리 메소드를 사용해야 합니다. 유형 주석은 컴파일 타임 목적으로만 존재하며 런타임에는그냥유형변수. 고려하다

    class MyClass(Generic[T]):
        def __init__(self, initialValue: Iterable[int], factory: Callable[[Iterable[int]], T]):
            self.values: T= factory(initialValue)
    

    다음과 같이 부르십시오.

    test= MyClass([1, 2, 3], lambda x: tuple(x))
    

    참고:그냥 통과하는 것이 좋습니다.튜플두 번째 인수로, 그러나마이피해당 유형 이름을호출 가능. 다른 유형 검사기가 이를 처리할 수 있습니다. 귀하의 마일리지가 다를 수 있습니다.

  • 답변 # 2

    명시적인 팩토리 메소드를 사용해야 합니다. 유형 주석은 컴파일 타임 목적으로만 존재하며 런타임에는그냥유형변수. 고려하다

    class MyClass(Generic[T]):
        def __init__(self, initialValue: Iterable[int], factory: Callable[[Iterable[int]], T]):
            self.values: T= factory(initialValue)
    

    다음과 같이 부르십시오.

    test= MyClass([1, 2, 3], lambda x: tuple(x))
    

    참고:그냥 통과하는 것이 좋습니다.튜플두 번째 인수로, 그러나마이피해당 유형 이름을호출 가능. 다른 유형 검사기가 이를 처리할 수 있습니다. 귀하의 마일리지가 다를 수 있습니다.

  • 이전 javascript : 업로드된 PDF를 노드의 파일로 변환
  • 다음 R의 여러 조건을 기반으로 문자열에서 부분 문자열 추출