Python 泛型与型变完全指南:从宠物医院看类型安全
引言:兽医科室的类型危机
假设你经营一家宠物医院。你有一个 "犬科专科住院部",只收治狗狗。某天,由于"动物住院部"床位紧张,护士打算把一只刚送来的哈士奇安排进"犬科专科住院部"——毕竟狗也是动物,对吧?
问题出现了:如果允许这样做,其他医生可能基于"这是普通动物住院部"的认知,往里面收治一只猫。结果当你去查房时,期待看到一只狗,却发现笼子里是一只猫——类型契约被破坏了。
class Animal: pass
class Dog(Animal): pass
class Cat(Animal): pass
class Ward(Generic[T]): # 住院部
def admit(self, patient: T) -> None: ... # 收治(写入)
def discharge(self) -> T: ... # 出院(读取)
def general_ward(ward: Ward[Animal]) -> None:
ward.admit(Cat()) # 对于普通动物病房,收治猫很合理!
dog_ward = Ward[Dog]() # 犬科专科
general_ward(dog_ward) # ❌ 类型检查器阻止了这一步!
# 如果允许:下一行会在运行时出问题
dog: Dog = dog_ward.discharge() # 期望得到狗,结果可能是猫!
这个"猫住进犬科病房"的问题,引出了泛型编程中最核心的概念:型变(Variance)。

