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

Python 接口:从协议到抽象基 类(Python喜欢序列)

Python喜欢序列

Python 数据模型的哲学是尽量支持基本协议。对序列来说,即便是最简
单的实现,Python 也会力求做到最好。

图 11-1 展示了定义为抽象基类的 Sequence 正式接口。

Sequence 抽象基类和 collections.abc 中相关抽象类的
UML 类图,箭头由子类指向超类,以斜体显示的是抽象方法

现在,看看示例 11-3 中的 Foo 类。它没有继承 abc.Sequence,而且
只实现了序列协议的一个方法:getitem (没有实现__len__ 方
法)。

示例 11-3 定义__getitem__ 方法,只实现序列协议的一部分,
这样足够访问元素、迭代和使用 in 运算符了

>>> class Foo:
... def __getitem__(self, pos):
... return range(0, 30, 10)[pos]
...
>>> f = Foo()
>>> f[1]
10
>>> for i in f: print(i)
...
0 10
20
>>> 20 in f
True
>>> 15 in f
False

虽然没有 __iter__ 方法,但是 Foo 实例是可迭代的对象,因为发现有
__getitem__ 方法时,Python 会调用它,传入从 0 开始的整数索引,
尝试迭代对象(这是一种后备机制)。尽管没有实现 __contains__
法,但是 Python 足够智能,能迭代 Foo 实例,因此也能使用 in 运算
符:Python 会做全面检查,看看有没有指定的元素。

综上,鉴于序列协议的重要性,如果没有__iter__ 和__contains__
方法,Python 会调用__getitem__ 方法,设法让迭代和 in 运算符可
用。

第 1 章定义的 FrenchDeck 类也没有继承 abc.Sequence,但是实现了
序列协议的两个方法:__getitem__ __len__。如示例 11-4 所示。
示例 11-4 实现序列协议的 FrenchDeck 类(代码与示例 1-1 相
同)

import collections
Card = collections.namedtuple('Card', ['rank', 'suit'])
class FrenchDeck:ranks = [str(n) for n in range(2, 11)] + list('JQKA')suits = 'spades diamonds clubs hearts'.split()def __init__(self):self._cards = [Card(rank, suit) for suit in self.suitsfor rank in self.ranks]def __len__(self):return len(self._cards)def __getitem__(self, position):return self._cards[position]

第 1 章那些示例之所以能用,大部分是由于 Python 会特殊对待看起来像
是序列的对象。Python 中的迭代是鸭子类型的一种极端形式:为了迭代
对象,解释器会尝试调用两个不同的方法。
下面再分析一个示例,着重强调协议的动态本性。

相关文章:

  • 井字棋——ai PK you
  • DAY 20 奇异值SVD分解
  • UGUI Text/TextMeshPro字体组件
  • git管理github上的repository
  • Spring 中创建 Bean 有几种方式?
  • 【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(1)——Chat Client API
  • 用户管理页面(解决toggleRowSelection在dialog用不了的隐患,包含el-table的plus版本的组件)
  • 华为OD机试_2025 B卷_最大岛屿体积(Python,100分)(附详细解题思路)
  • 自然语言处理(NLP)的系统学习路径规划
  • 博客摘录「 数据库系统概论课后习题答案(第五版 王珊、萨师煊)」2024年10月30日
  • WAF绕过,网络层面后门分析,Windows/linux/数据库提权实验
  • 07.MySQL内置函数
  • 张雪峰为9岁女儿申请40个左右商标!
  • 【数据库】《DBA实战手记》- 读书笔记
  • MyBatis常用注解全解析:从基础CRUD到高级映射
  • 工作服/反光衣检测算法AI智能分析网关V4安全作业风险预警方案:筑牢矿山/工地/工厂等多场景安全防线
  • 攻防世界-unseping
  • 新版 Xcode 中 CoreData 模型编辑器显示拓扑图功能取消的替代方案
  • Python与数据分析期末复习笔记
  • 数字商城小程序源码,开启便捷电商新体验
  • 做网站用什么插件/绍兴seo公司
  • 自己动手制作网站/收录网站查询
  • 张家港手机网站建设/台州关键词首页优化
  • b2b电子商务网站的收益模式不包括/百度搜一下
  • 做网站的合同/深圳网络优化公司
  • 西安网站建设服务商十强/seo教程培训