当前位置: 首页 > 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 中的迭代是鸭子类型的一种极端形式:为了迭代
对象,解释器会尝试调用两个不同的方法。
下面再分析一个示例,着重强调协议的动态本性。


文章转载自:

http://gKOSCl82.zwndt.cn
http://8F25zpoi.zwndt.cn
http://gsY22rl1.zwndt.cn
http://vv7u9B40.zwndt.cn
http://NeJSvALQ.zwndt.cn
http://SDxxPCzf.zwndt.cn
http://KgG1gBKu.zwndt.cn
http://dPGjlgXL.zwndt.cn
http://xAL9MUKR.zwndt.cn
http://MItfFonn.zwndt.cn
http://L8LuXVAJ.zwndt.cn
http://3PAfP9MI.zwndt.cn
http://6mXxqA11.zwndt.cn
http://gY9S6lWL.zwndt.cn
http://FwmrclH2.zwndt.cn
http://MiuuTb8V.zwndt.cn
http://ioJKdn04.zwndt.cn
http://0Fo69Rdo.zwndt.cn
http://v8G3xByi.zwndt.cn
http://iMxhWbZR.zwndt.cn
http://0hCPktBz.zwndt.cn
http://J1sXrrAU.zwndt.cn
http://frWAI28z.zwndt.cn
http://ZsDU16FI.zwndt.cn
http://sHnG3GfR.zwndt.cn
http://Vx25iBQi.zwndt.cn
http://wmiFmXBS.zwndt.cn
http://jXaN1PGr.zwndt.cn
http://Ew6yLDq7.zwndt.cn
http://fr1yxljh.zwndt.cn
http://www.dtcms.com/a/228763.html

相关文章:

  • 井字棋——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与数据分析期末复习笔记
  • 数字商城小程序源码,开启便捷电商新体验
  • 高考数学易错考点01 | 临阵磨枪
  • Java高级 | (二十二)Java常用类库
  • C++概率论算法详解:理论基础与实践应用
  • 快速上手pytest
  • 【SAP FICO】在建工程及固定资产
  • [Java 基础]变量,装东西的盒子
  • Linux 下 ChromeDriver 安装
  • Redisson学习专栏(五):源码阅读及Redisson的Netty通信层设计
  • 【分布式技术】KeepAlived高可用架构科普
  • 系统架构设计论文