Python如何设置类方法返回类型为类属性且子类可匹配正确类型
解决方案
你遇到的问题核心是两个类型标注规则的限制:
- 类型标注不支持直接通过类型变量访问类属性来获取类型
- 未定义为泛型的类,其属性类型是固定的,子类重写不同类型会触发兼容性错误
正确的实现方式是将基类A定义为泛型类,用泛型参数绑定TYPE属性的类型:
# typings.py from typing import TypeVar, Type, Generic, ClassVar T = TypeVar("T", int, str) class A(Generic[T]): TYPE: ClassVar[Type[T]] = int @classmethod def get_instance(cls: Type[A[T]]) -> T: return cls.TYPE() class B(A[str]): TYPE = str a = B.get_instance() reveal_type(a) # mypy 输出: Revealed type is "builtins.str"
调整说明
- 引入
Generic[T]让A成为泛型类,泛型参数T对应TYPE实例化后的返回值类型 - 给
TYPE添加ClassVar[Type[T]]标注,明确该类属性是T类的类型对象 - 类方法返回值直接标注为T,类型系统会自动根据子类继承时传入的泛型参数匹配对应类型
- 子类B继承时显式指定泛型参数为
A[str],类型系统会自动识别get_instance返回值为str
运行mypy检查不会再报错,返回值类型可以被正确识别。
内容的提问来源于stack exchange,提问作者ZinkLu
相关产品推荐
相关产品推荐

