子类方法注解引用父类注解子类的Python类型提示兼容问题
解决方法
核心问题在于Python的list是不变类型——即便B是A的子类,list[type[B]]也无法被视为list[type[A]]的子类型,直接重写父类方法的返回类型会触发类型不兼容错误。你之前尝试的协变TypeVar没有生效,是因为没有将父类C定义为泛型类。
正确的解决方案是将C声明为泛型类,结合协变TypeVar来实现兼容的返回类型注解:
from typing import TypeVar, Generic, List, Type class A: pass class B(A): extra_attr: str # B特有的属性 # 定义协变TypeVar,绑定到A类型 T = TypeVar('T', bound=A, covariant=True) # 将C定义为泛型类,继承Generic[T] class C(Generic[T]): def foo(self) -> List[Type[T]]: ... # D继承泛型类C[B],此时foo的返回类型自然为List[Type[B]] class D(C[B]): def foo(self) -> List[Type[B]]: ...
为什么这样可行?
- 泛型类
C[T]使用协变TypeVar后,C[B]会被视为C[A]的子类型(因为B是A的子类,协变允许子类泛型替代父类泛型)。 D继承C[B]后,重写的foo方法返回List[Type[B]],与父类C[B].foo的返回类型完全匹配,同时对于期望C[A]的场景,D实例也能安全替代(因为Type[B]是Type[A]的子类型,协变保证了兼容性)。- 这样既满足了
D.foo必须返回B类列表的需求,又符合类型系统的规则,mypy不会再报错。
内容的提问来源于stack exchange,提问作者Paul Gilmartin
相关产品推荐
相关产品推荐

