python 3.12+ 支持泛型类新语法 class container[t]:,无需 typevar 和 generic 继承;t 作用域限于类内,多参数如 map[k, v];泛型别名必须用 type stack[t] = list[t];泛型仅用于静态检查,运行时无强制。

直接用 class Container[T]: 就行,不用再写 from typing import Generic, TypeVar 和继承 Generic[T]。
泛型类声明必须带 class 关键字和方括号类型参数
旧写法要两步:先定义 TypeVar,再让类继承 Generic[T];新语法把类型参数直接挂到类名后面,解释器在语法分析阶段就识别出 T 是类型形参。
-
T的作用域仅限于该类定义内部,类外不能直接引用(比如在类外写def f(x: T) -> T:会报NameError) - 类体中所有对
T的使用都自动绑定到这个声明,无需额外注解或约束 - 不支持省略方括号:
class Container:就是普通类,class Container[T]:才是泛型类 - 可声明多个参数:
class Map[K, V]:,顺序和用途由你定义,不强制K是键、V是值,但建议保持惯例
type 别名声明泛型时不能漏掉 type 关键字
想定义一个泛型类型别名(比如 Stack[T]),必须显式用 type 开头,否则解释器当普通赋值处理,类型检查器(如 mypy)会忽略泛型语义。
- ✅ 正确:
type Stack[T] = list[T]——T自动绑定,Stack[int]被识别为list[int] - ❌ 错误:
Stack[T] = list[T]—— 触发NameError: name 'T' is not defined - ❌ 半正确:
Stack = list[T]—— 运行时不报错,但 mypy 不认为这是泛型别名,无法做泛型推导 - 嵌套也适用:
type Pair[K, V] = tuple[K, V],比老写法class Pair(Generic[K, V]): ...简洁得多
泛型类实例化时类型推断更自然,但运行时不做强制
Python 依旧行动态类型,泛型只服务于静态检查和 IDE 提示。类定义用了 [T],不代表运行时能拦住类型错误。
- 构造实例时可省略类型参数:
box = Box("hello"),mypy 推断为Box[str] - 也可显式标注:
box: Box[int] = Box(42),用于明确意图或辅助检查 - 传入不匹配类型不会崩溃,但 mypy 会报错:
Box[str](42)→Argument 1 to "Box" has incompatible type "int"; expected "str" - 类方法返回值自动绑定:
def get(self) -> T:中的T就是实例化时确定的那个类型
最容易被忽略的是作用域边界——T 只活在它被声明的那个 class 或 def 里,跨作用域复用会直接失败,不是配置问题,是语法设计如此。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











