You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

子类方法注解引用父类注解子类的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]]:
        ...

为什么这样可行?

  1. 泛型类C[T]使用协变TypeVar后,C[B]会被视为C[A]的子类型(因为B是A的子类,协变允许子类泛型替代父类泛型)。
  2. D继承C[B]后,重写的foo方法返回List[Type[B]],与父类C[B].foo的返回类型完全匹配,同时对于期望C[A]的场景,D实例也能安全替代(因为Type[B]是Type[A]的子类型,协变保证了兼容性)。
  3. 这样既满足了D.foo必须返回B类列表的需求,又符合类型系统的规则,mypy不会再报错。

内容的提问来源于stack exchange,提问作者Paul Gilmartin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:50:00