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
相关产品推荐
相关产品推荐

