Python学习(11) ----- Python的泛型

在 Python 中,泛型(Generics) 的概念主要用于 类型注解(type hints) ,帮助开发者在静态类型检查时(例如使用 mypy、pyright)获得更精确的类型推断。

泛型不影响程序的运行行为 ,而是让代码在 语义上更清晰、更安全。


🧠 一、泛型是什么?

泛型的核心思想:

"一个类型对多种数据类型通用"。

例如,List[int] 表示一个只能装 int 的列表,
List[str] 表示一个只能装 str 的列表。

这可以防止混用类型的错误:

python 复制代码
from typing import List

def sum_list(numbers: List[int]) -> int:
    return sum(numbers)

print(sum_list([1, 2, 3]))   # ✅ 正常
print(sum_list(["a", "b"]))  # ❌ 类型检查器会报错

🧩 二、使用泛型类型(TypeVar)

TypeVar 用于声明一个泛型参数:

python 复制代码
from typing import TypeVar, List

T = TypeVar("T")  # 声明一个泛型类型变量

def first_element(elements: List[T]) -> T | None:
    if elements:
        return elements[0]
    return None

🔹 用法说明:

  • T 表示一个"占位类型";
  • 函数返回的类型与输入 List[T] 的元素类型一致;
  • 当传入 List[int] 时,返回值类型自动推断为 int。
python 复制代码
print(first_element([1, 2, 3]))    # 返回 int
print(first_element(["a", "b"]))   # 返回 str

🧱 三、在类中使用泛型

泛型类可以让类在定义时不固定数据类型:

python 复制代码
from typing import Generic, TypeVar

T = TypeVar("T")

class Box(Generic[T]):
    def __init__(self, value: T):
        self.value = value

    def get(self) -> T:
        return self.value

✅ 使用时指定类型:

python 复制代码
box1 = Box 
box2 = Box[str]("hello")

print(box1.get())  # int
print(box2.get())  # str

⚙️ 四、带约束的泛型

可以通过 bound 或者 constraints 限制泛型类型:

1️⃣ bound(上界约束)

python 复制代码
from typing import TypeVar

class Animal:
    def speak(self):
        print("Animal sound")

class Dog(Animal):
    def speak(self):
        print("Woof!")

T = TypeVar("T", bound=Animal)

def make_speak(animal: T) -> None:
    animal.speak()

make_speak(Dog())    # ✅ OK
make_speak(Animal()) # ✅ OK
# make_speak("string") ❌ 报类型错误

2️⃣ constraints(多类型约束)

python 复制代码
from typing import TypeVar

T = TypeVar("T", int, float)  # 只能是 int 或 float

def double(x: T) -> T:
    return x * 2

print(double(10))    # ✅ int
print(double(3.14))  # ✅ float
# print(double("a")) ❌ 类型检查失败

🧩 五、常用泛型容器

Python 的标准库 typing 模块已经提供了许多泛型容器:

泛型类型 说明
List[T] 列表
Dict[K, V] 字典
Tuple[T, ...] 元组
Set[T] 集合
Iterable[T] 可迭代对象
Optional[T] T 或 None
Union[A, B] A 或 B

例如:

python 复制代码
from typing import Dict, List, Optional, Union

def process_data(data: Dict[str, List[int]]) -> Optional[Union[int, float]]:
    if "scores" in data:
        return sum(data["scores"]) / len(data["scores"])
    return None

🧭 六、Python 3.9+ 简写语法

在 Python 3.9 之后,可以用更简洁的语法:

python 复制代码
# 旧写法
from typing import List, Dict
def f1(data: List[int]) -> Dict[str, int]:
    ...

# 新写法(推荐)
def f2(data: list[int]) -> dict[str, int]:
    ...

✅ 小结

概念 用法示例
定义泛型变量 T = TypeVar("T")
泛型函数 def func(x: T) -> T:
泛型类 class Box(Generic[T]):
约束类型 TypeVar("T", bound=Base) 或 TypeVar("T", int, float)
内置泛型容器 list[T], dict[K, V], tuple[T, ...]

相关推荐
青少儿编程课堂几秒前
2026蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:堆排序与优先队列解析
c++·python·算法·bfs·信息学竞赛
Eiceblue1 分钟前
用 Python 给 Word 文档加水印:文字、图片与批量处理
开发语言·vscode·python·word
芒果作者6 分钟前
我决定系统学习 Codex,并建立一套自己的知识库
学习
Android小码家15 分钟前
framework&framework-minus-apex&android.jar的区别
android·python·jar
lee_curry19 分钟前
第十周完整学习笔记:继续升级为“检索更准、权限安全、索引可维护、失败可恢复、长期可运行”的企业级 RAG 系统
python·ai·langchain·agent·langgraph
IsITGirl40 分钟前
VMware Fusion(Mac)Windows ARM 虚拟机 NAT (vmnet8) 报错解决记录
windows·macos·.net·桥接模式
Ivanqhz1 小时前
MoE + LLM 应用
数据库·人工智能·pytorch·python·深度学习·算法·1024程序员节
Rudon滨海渔村1 小时前
台式机Win10实现“音量+”和“音量-”,键盘映射方案
windows·计算机外设·powertoys
2501_915921431 小时前
KXBuild CI 实操,Windows/Linux 服务器接入 Jenkins 打包 iOS IPA
服务器·windows·vscode·ios·ci/cd·个人开发·敏捷流程
Mr. zhihao1 小时前
Deep Agent 架构深度解析:主Agent与子Agent完整交互机制与核心参数作用
python·ai·langgraph·deepagent