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

如何基于重载的__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

关键说明

  1. 类型变量与泛类绑定

    • 定义T = TypeVar('T', int, float),限定T只能取int或float类型,和你__init__的重载规则完全匹配。
    • 让Vector3继承Generic[T],这样每个Vector3实例都会携带自己的类型信息(是int实例还是float实例)。
  2. 精确的类型提示

    • __init__的实现部分给参数和实例变量都加上T类型标注,让类型检查器能推断出实例的具体类型。
    • __key函数的返回类型设为tuple[T, T, T],这样返回的元组类型会和实例的初始化参数类型严格一致,而不是宽泛的int | float组合。
    • @property的x/y/z属性返回类型设为T,类型检查器会根据实例的创建方式,自动识别属性是int还是float类型。

效果示例

当你创建不同类型的实例时,类型检查器会给出精确的提示:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:25:15