《从零手写一个“支持泛型”的自定义容器:Generic + Protocol 的工程化实战(兼顾初学者与进阶开发者)》
你有没有遇到过这样的场景:
你写了一个容器类Cache、Queue、Repository、Store……✅ 它能装任何东西,使用起来非常灵活
❌ 但当项目越来越大,你开始害怕:
- 里面到底装的是
User还是Order?- 调用
.get()时返回的是T还是Optional[T]?- IDE 补全不准、重构不敢动
- 同事调错类型,Bug 藏得像地雷
这个时候,你很可能会产生一种渴望:
“如果我的容器能像list[int]那样支持泛型就好了。”这篇文章,我们就来一步一步手写一个支持泛型的自定义容器:
✅ 支持MyContainer[int]这种类型参数化
✅ 使用typing.Generic+TypeVar建立类型传递
✅ 用Protocol抽象容器接口,让依赖更稳定、更可测试
✅ 并加入一些“真实生产环境”的最佳实践:运行时校验、迭代器、线程安全、缓存策略等你会发现:Python 的泛型不仅是“注解”,更是一种可设计、可建模的工程能力。
目录(建议收藏)
- Python 泛型的意义:为什么你应该关心?
- TypeVar + Generic 的基础入门(初学者友好)
- 第一个泛型容器:手写
Box[T] - 设计一个实用容器:
Stack[T](支持迭代、len、repr) Protocol出场:解耦容器使用方与实现方- 进阶:泛型容器的“类型安全 API”设计
- 实战案例:手写一个泛型
Repository[T](模拟 ORM/DAO) - 运行时校验:泛型容器能不能真正“强类型”?
- 单元测试 + 工程最佳实践:写得稳、跑得快、团队可协作
- 前沿趋势:Python 类型系统的下一站
- 总结与互动
1. Python 泛型的意义:为什么你应该关心?
泛型的核心价值只有一句话:
让你的代码在保持复用能力的同时,仍然保留类型信息。
没有泛型会怎样?
class Stack:
def push(self, item):
...
def pop(self):
...
你永远不知道 pop() 返回的是啥。
IDE 无法补全,mypy 无法检测,代码越写越“玄学”。
有泛型后会怎样?
stack: Stack[int] = Stack()
stack.push(1)
x = stack.pop() # IDE 知道 x 是 int
这不仅是“舒服”,更是工程效率、安全性、可维护性的提升。
2. TypeVar + Generic 的基础入门(初学者友好)
2.1 TypeVar 是什么?
TypeVar 用来表示一个“类型变量”,你可以理解为:
T = “某一种具体类型,但现在还不知道是什么”。
from typing import TypeVar
T = TypeVar("T")
2.2 Generic 是什么?
Generic[T] 是一个“泛型基类”,告诉 Python:
这个类会使用类型变量 T,并且支持类型参数化。
from typing import Generic
class Box(Generic[T]):
...
3. 第一个泛型容器:手写 Box[T]
先用最简单的 Box[T] 来理解类型是如何传递的。
from typing import TypeVar, Generic
T = TypeVar("T")
class Box(Generic[T]):
def __init__(self, value: T):
self._value = value
def get(self) -> T:
return self._value
def set(self, value: T) -> None:
self._value = value
使用:
b1 = Box
x = b1.get() # x 被推断为 int
b2 = Box[str](

最低0.47元/天 解锁文章
10万+

被折叠的 条评论
为什么被折叠?



