当前位置: 首页 > article >正文

Python的泛型(Generic)与协变(Covariant)

今天咱们聊聊Python类型标注中的泛型(Generic),与协变(Covariant)。

不了解类型标注的小伙伴,可以先看一看我的上一篇文章 “Python类型检查” Python 类型检查-CSDN博客

例子

这次我开个宠物商店。看下面代码。

class Animal:
	pass

class Dog(Animal):
	pass
	
class Cat(Animal):
	pass

首先我们定义了宠物的基类Animal,Dog和Cat都是Animal的子类。

然后是商店类Store

class Store:
	def __init__(self, stock: List[Animal]) -> None:
		self.stock = stock
		
	def buy(self) -> Animal:
		return self.stock.pop()

商店的构造函数会接受一个Animal的列表stock,当作商店的库存。有人买东西时,buy函数就从库存里面拿出一个动物当作返回值。

为了简洁,我这里没有判断stock里面到底还有没有动物,直接就pop了。小伙伴们写代码时请务必不要向我学习。

然后老王宠物店就开张了。我们生成一个Store的实例叫wang。调用buy方法卖东西。

wang = Store([Dog(), Cat()])
print(wang.buy())

来运行一下程序和类型检查器mypy。

$ mypy covar.py
Success: no issues found in 1 source file

太好了,没有错误。

泛型

这时,假如老王我对猫过敏,所以决定从今以后宠物店里只卖狗了。要怎么办呢?

最直接的办法是改Store的类型标注,把构造函数里的List[Animal]改成List[Dog]。buy的返回值也改成Dog。

class Store:
	def __init__(self, stock: List[Dog]) -> None:
		self.stock = stock
		
	def buy(self) -> Dog:
		return self.stock.pop()

结果刚改好,对门儿宠物店的老李头骂着街就过来了。因为他家的猫没法卖了。那到底怎么办呢?泛型就可以解决这个问题。

“Python类型检查” 中我们聊的List,Sequence都是泛型。比如我写

a: List

http://www.kler.cn/a/513376.html

相关文章:

  • 我的创作纪念日,纪念我的第512天
  • 【Golang/gRPC/Nacos】在golang中将gRPC和Nacos结合使用
  • 火狐浏览器Firefox一些配置
  • JDK长期支持版本(LTS)
  • STM32补充——FLASH
  • 亲测有效!如何快速实现 PostgreSQL 数据迁移到 时序数据库TDengine
  • 总结研究ChatGPT提示词分享
  • 【人工智能】Python常用库-Keras:高阶深度学习 API
  • LabVIEW智能胎压监测
  • ARM-V9 CCA/RME QEMU环境搭建
  • 【leetcode 26】28.找出字符串中第一个匹配项的下标 | 实现 strStr()==❗不会❗==
  • Java数据结构——优先队列
  • 2025牛客寒假训练营1【代码】 A B D E G H J M
  • 线性回归笔记1-4
  • java依赖问题
  • VBA语言的区块链
  • 人工智能技术在冷链物流行业的应用前景
  • Java Web开发高级——单元测试与集成测试
  • Yearning开源MySQL SQL审核平台
  • 稳定的通信桥梁,CCLINKIE转ModbusTCP网关实现AGV运输的光速效应
  • 基于Python的多元医疗知识图谱构建与应用研究(上)
  • 基于Hadoop MapReduce的WordCount任务实现与部署
  • 什么是可信数据空间?有什么作用?
  • matlab构造线性相位FIR滤波器
  • 【算法】字符串之227.基本计算器 -- 双栈的变形
  • docker安装rabbitmq并启动测试页面