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

Mypy访问父类属性时类型推断错误,如何识别子类类型?

解决Mypy子类属性类型推断为父类的问题

这个问题的核心是父类C没有用泛型来约束它存储的类型,导致Mypy只能推断出store是最宽泛的A类型。咱们可以通过给C添加泛型参数来让Mypy正确识别子类中store的具体类型,具体实现如下:

修改后的代码

from typing import Generic, TypeVar, reveal_type

class A: pass
class B(A): pass

# 定义一个绑定到A及其子类的类型变量
T = TypeVar('T', bound=A)

# 让C继承Generic[T],用T约束param和store的类型
class C(Generic[T]):
    def __init__(self, param: T) -> None:
        self.store: T = param

# 子类D继承C时指定泛型参数为B
class D(C[B]):
    def __init__(self, param: B) -> None:
        super().__init__(param)

# 测试类型推断
d_instance = D(B())
reveal_type(d_instance.store)  # Mypy现在会输出:Revealed type is 'test.B'

为什么这样有效?

  • 我们用TypeVar定义了一个类型变量T,并通过bound=A限制它只能是A或它的子类,这样既保证了类型安全,又保留了灵活性。
  • 父类C继承Generic[T]后,就变成了一个泛型类,它的store属性类型会跟随传入的T动态变化。
  • 子类D明确指定继承C[B],相当于告诉Mypy:这个子类版本的C中,T的具体类型是B,所以store自然就被推断为B类型了。

如果你不想在子类继承时显式指定泛型参数,也可以让Mypy通过__init__的参数类型自动推断,但显式指定的方式更直观,也能避免潜在的类型歧义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:25:16