如何定义与被包装类型接口一致的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
相关产品推荐
相关产品推荐

