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

如何正确标注继承泛型基类子类的类的类型?

问题描述

我有两个继承自dict的类,代码如下:

class A(dict):

class B(A):

这能正常运行,两个类继承了dict的功能并实现其他需求。但我想添加类型提示:类A需要缩小Dict泛型的范围,类B需要进一步缩小该范围。例如我想写成:

class A(Dict[str, Any]):

class B(A[str, int]):

这样写A没问题,但B的写法存在语法错误。B并非A的子类型(因为它仅能处理int类型),这是可接受的,但我需要它继承A。有没有办法让mypy识别B的正确类型同时保持继承关系?目前我想到的唯一方案是重新实现A的所有继承方法,但这会产生大量仅用于类型声明的运行时代码。

解决方案

可以通过让A成为泛型类来实现需求,既保留继承关系,又能让mypy识别正确的类型约束,无需重复实现方法:

  • 先将类A定义为泛型类,固定键类型为str,值类型设为泛型参数:

    from typing import Dict, Generic, TypeVar, Any
    
    V = TypeVar('V')  # 定义值类型的泛型变量
    
    class A(Dict[str, V], Generic[V]):
        # 保留A原本的业务逻辑即可
        pass
    
  • 类B继承A时指定泛型参数为int,这样既继承A的所有功能,又能让mypy识别B的类型为Dict[str, int]:

    class B(A[int]):
        # 添加B独有的业务逻辑
        pass
    

这样处理后:

  • 实例化A时可指定值类型,比如A[Any]();如果希望A默认值类型为Any,可以修改泛型变量定义:V = TypeVar('V', default=Any),之后直接写A()就等价于A[Any]()
  • B的实例会被mypy正确识别为键是str、值是int的字典类型,同时完全继承A的方法和属性,无需重复实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:45:15