如何基于重载的__init__为函数返回值添加类型提示?
解决方案
要让__key函数的返回类型和初始化参数类型严格匹配,同时给@property属性添加准确的类型提示,你需要用**泛型(Generic)**结合TypeVar来绑定类的实例类型。这样类型检查器就能识别出每个Vector3实例是基于int还是float创建的,从而给出精确的类型提示。
完整代码实现
from typing import overload, Generic, TypeVar # 定义类型变量,限定只能是int或float T = TypeVar('T', int, float) class Vector3(Generic[T]): @overload def __init__(self, x: int, y: int, z: int) -> None: ... @overload def __init__(self, x: float, y: float, z: float) -> None: ... def __init__(self, x: T, y: T, z: T) -> None: self._x: T = x self._y: T = y self._z: T = z def __key(self) -> tuple[T, T, T]: return (self._x, self._y, self._z) @property def x(self) -> T: return self._x @property def y(self) -> T: return self._y @property def z(self) -> T: return self._z
关键说明
类型变量与泛类绑定
- 定义
T = TypeVar('T', int, float),限定T只能取int或float类型,和你__init__的重载规则完全匹配。 - 让
Vector3继承Generic[T],这样每个Vector3实例都会携带自己的类型信息(是int实例还是float实例)。
- 定义
精确的类型提示
- __init__的实现部分给参数和实例变量都加上
T类型标注,让类型检查器能推断出实例的具体类型。 - __key函数的返回类型设为
tuple[T, T, T],这样返回的元组类型会和实例的初始化参数类型严格一致,而不是宽泛的int | float组合。 - @property的x/y/z属性返回类型设为
T,类型检查器会根据实例的创建方式,自动识别属性是int还是float类型。
- __init__的实现部分给参数和实例变量都加上
效果示例
当你创建不同类型的实例时,类型检查器会给出精确的提示:
v_int = Vector3(1, 2, 3) reveal_type(v_int.x) # 输出: int reveal_type(v_int.__key()) # 输出: tuple[int, int, int] v_float = Vector3(1.5, 2.5, 3.5) reveal_type(v_float.x) # 输出: float reveal_type(v_float.__key()) # 输出: tuple[float, float, float]
内容的提问来源于stack exchange,提问作者Jab
相关产品推荐
相关产品推荐

