Python 协议:连接类型检查和运行时类型系统的桥梁
1. 子类型关系与注意事项
在编程里,子类型关系是个强大的概念,能在不修改现有功能的基础上对其进行扩展。不过,继承常被过度或不当使用。子类型只有在能直接替代其超类型时才应被使用,若无法替代,建议使用组合。
在引入超类型或子类型时要格外小心,开发者可能难以知晓与单个超类型关联的所有子类型,部分子类型或许存在于其他代码库中。超类型和子类型紧密耦合,所以每次进行更改时都需谨慎。只要谨慎对待,就能充分享受子类型带来的益处,避免诸多麻烦。
2. 类型系统的矛盾
Python 支持鸭子类型,即只要对象支持特定行为集,就能在相应上下文中使用该对象,无需任何父类或预定义的继承结构。然而,类型检查器在没有辅助的情况下,不知如何处理鸭子类型。类型检查器能处理静态分析时已知的类型,但对于运行时做出的鸭子类型决策却无能为力。
为解决这个问题,Python 3.8 引入了协议。协议能在类型检查时对鸭子类型的变量进行注释。在深入了解协议之前,得先明白 Python 的鸭子类型和静态类型检查器之间的差异。
以构建自动化午餐店的数字菜单系统为例,该餐厅有多种可“拆分”的菜品,如熟食三明治、卷饼和汤,但饮料和汉堡等则不能拆分。为避免代码重复,需要一个方法来处理所有的拆分操作。以下是一些菜品类的示例:
class BLTSandwich:
def __init__(self):
self.cost = 6.95
self.name = 'BLT'
# This
超级会员免费看
订阅专栏 解锁全文

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



