내 문제는 클래스 A에 대해 일을 수행하고 그 함수를 서브 클래스 (B)로 사용하면 여전히 클래스 A에 대해 입력되고 클래스 B 객체를 인수 또는 함수 서명으로 받아들이지 않는다는 것입니다. . 단순화상속 된 형식 힌트를 파이썬으로 가져 오는 방법은 무엇입니까?
내 문제 :
from typing import TypeVar, Generic, Callable
T = TypeVar('T')
class Signal(Generic[T]):
def connect(self, connector: Callable[[T], None]) -> None:
pass
def emit(self, payload: T):
pass
class A:
def __init__(self) -> None:
self.signal = Signal[A]()
def do(self) -> None:
self.signal.emit(self)
def handle_b(b: "B") -> None:
print(b.something)
class B(A):
def __init__(self) -> None:
super().__init__()
self.signal.connect(handle_b)
@property
def something(self) -> int:
return 42
은 나뿐만 아니라 전체 신호 클래스를 제공 할 수 있지만 그것은 단지 문제에서 그러기. 이것은 mypy -> error에서 하나의 에러를 남겨 둡니다 : "Signal"의 "connect"에 대한 인수 1은 호환되지 않는 타입의 호출 가능 [[B], None]; 예상 호출 가능 [A], 없음] 신호 처리가 명확 잘해야 비록 B 형 객체가 반환 될 것으로 예상 할 수없는 상기 서브 클래스 B에서 구현되기 때문에
...
글쎄, 오류가 옳다면,'self.signal = Signal [A]()'에만'self.signal'을'A'로 제한하십시오. –
기본적으로'T = A'를 설정합니다. 'B'는 서브 클래스 일 수 있지만'A.something '이 존재하지 않기 때문에 그 속성을 사용할 수 없습니다. 이제 모든 것을 'A'에 묶었습니다. 'B'를 받아들이는 메소드는'B.something'을 사용하는 것이 명백히 허용되어서 기본 클래스'A'는 그 요구 사항을 결코 만족시킬 수 없습니다. –