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

如何定义与被包装类型接口一致的Python泛型包装类MyType[T]?

需求可行性与实现方案

你的需求是可行的,具体实现分两种场景:仅满足类型检查等价,或同时实现运行时包装行为。

场景1:仅类型检查层面让MyType[T]等价于T

如果只需要类型检查器将MyType[int]视为int,不需要自定义运行时行为,最简单的方式是利用__class_getitem__让泛型返回原类型:

from typing import TypeVar

T = TypeVar("T")

class MyType:
    @classmethod
    def __class_getitem__(cls, item: type[T]) -> type[T]:
        return item

此时MyType[int]在类型检查器中完全等价于int,运行时MyType[int]也会返回int类,MyType[int](10)直接创建int实例。

你也可以用类型别名实现同样的类型检查效果:

from typing import TypeVar, TypeAlias

T = TypeVar("T")
MyType: TypeAlias = T

场景2:运行时包装实例+类型检查认可

如果需要MyType是一个实际的包装类,同时让类型检查器认为它拥有T的全部接口,需要实现属性/方法转发,并模拟特殊方法:

from typing import Generic, TypeVar

T = TypeVar("T")

class MyType(Generic[T]):
    def __init__(self, value: T) -> None:
        self._value = value

    # 转发普通属性和方法
    def __getattr__(self, name: str):
        return getattr(self._value, name)

    def __setattr__(self, name: str, value):
        if name == "_value":
            super().__setattr__(name, value)
        else:
            setattr(self._value, name, value)

    # 模拟特殊方法(__getattr__不处理双下划线开头的方法)
    def __int__(self) -> int:
        return int(self._value)
    
    def __str__(self) -> str:
        return str(self._value)
    
    def __add__(self, other):
        result = self._value + other
        return MyType(result) if isinstance(result, type(self._value)) else result

    # 按需添加其他特殊方法(如__sub__、__mul__等)

这种方式下,MyType[int](5)是一个包装实例,能调用int的所有方法,类型检查器会通过泛型约束认可它与int的接口兼容性。如果需要更严格的类型检查,可以结合Protocol定义原类型的接口并让MyType实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:04:56