如何创建Python泛型类以支持Classy[int]这类嵌套类型声明?
如何创建支持泛型的Python类(像Dict[str, int]那样的形式)
嘿,你说得对,Python的泛型类型注解确实能让代码的类型信息更清晰,还能配合类型检查工具(比如mypy)提前发现问题。要让你的Classy类支持Classy[int]、Classy[str]这种泛型写法,其实很简单,只需要用到标准库的typing模块(Python 3.5+支持)来实现泛型类。
步骤1:导入必要的工具
首先,你需要导入TypeVar和Generic:
from typing import TypeVar, Generic, List
TypeVar用来定义一个“类型变量”,它代表我们后续要传入的任意类型(比如int、str或者List[int])Generic是一个基类,你的类继承它之后就能成为泛型类
步骤2:定义类型变量
先声明一个类型变量,比如叫T(你也可以起更有意义的名字,比如ValueType):
T = TypeVar('T')
这个T就像一个占位符,后续会被具体的类型替代。
步骤3:改造你的Classy类
让Classy继承Generic[T],并且在初始化方法和属性中使用T作为类型注解:
class Classy(Generic[T]): def __init__(self, x: T) -> None: self.value: T = x
现在你的Classy就变成了一个泛型类,支持Classy[int]、Classy[str]、Classy[List[int]]这样的写法了!
用法示例
你可以这样创建不同类型的实例,类型检查工具能准确识别类型是否匹配:
# 持有int类型的实例 int_obj: Classy[int] = Classy(42) print(int_obj.value) # 42,类型是int # 持有str类型的实例 str_obj: Classy[str] = Classy("泛型真好用") print(str_obj.value) # 泛型真好用,类型是str # 持有List[int]类型的实例 list_obj: Classy[List[int]] = Classy([1, 3, 5]) print(list_obj.value) # [1,3,5],类型是List[int]
如果传入的类型和声明的泛型类型不匹配,比如:
# 用mypy检查这行代码会报错:期望int,实际传入str wrong_obj: Classy[int] = Classy("我不是整数")
类型检查工具会立刻提醒你,避免潜在的bug。
Python 3.9+的简化写法
从Python 3.9开始,标准库支持直接用内置类型(比如list、dict)作为泛型,不需要再导入List、Dict了,代码可以更简洁:
from typing import TypeVar, Generic T = TypeVar('T') class Classy(Generic[T]): def __init__(self, x: T) -> None: self.value: T = x # 直接用list[int]代替List[int] list_obj: Classy[list[int]] = Classy([2, 4, 6])
内容的提问来源于stack exchange,提问作者dmvianna
相关产品推荐
相关产品推荐

