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
原文地址:https://blog.csdn.net/weixin_42451919/article/details/145286096
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!