这一节会展示如何实现__getitem__和__len__这两个特殊的方法


首先看一个利用python构建的纸牌类,这个例子短小却包含了python一些非常重要的特征:

import collectionsCard = collections.namedtuple('Card', ['rank', 'suit'])class FrenchDesk(object):ranks = [str(i) for i 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]desk = FrenchDesk()
print(len(desk))
print(desk[-1])Return:
52
Card(rank='A', suit='hearts')

collections.namedtuple

Python中存储系列数据,比较常见的数据类型有list,除此之外,还有tuple数据类型。相比与list,tuple中的元素不可修改,在映射中可以当键使用。tuple元组的item只能通过index访问,collections模块的namedtuple子类不仅可以使用item的index访问item,还可以通过item的name进行访问,可以用来增强代码的可读性。可以将namedtuple理解为c中的struct结构,其首先将各个item命名,然后对每个item赋予数据。

len(desk) 与desk[index]

由于实现了__len__(self)方法,所以可以直接使用len(desk)获取长度,作为你的类的用户,不必去记住标准操作的各式名称(“怎么得到元素的总数?是 .size() 还是 .length() 还是别的什么?”)。

同样, __getitem__ 方法把 [] 操作交给了 self._cards 列表,所以 deck 类还自动支持切片(slicing)操作。另外,仅仅实现了 __getitem__ 方法,这一摞牌就变成可迭代的了。

总结

虽然 FrenchDeck 继承了 object 类, 但功能却不是继承而来的。通过数据模型和一些合成来实现这些功能。通过实现 __len__ 和 __getitem__ 这两个特殊方法,FrenchDeck 就跟一个 Python 自有的序列数据类型一样,可以体现出 Python 的核心语言特性(例如迭代和切片)。同时这个类还可以用于标准库中诸如 random.choice、reversed 和 sorted 这些函数。另外,对合成的运用使得 __len__ 和 __getitem__ 的具体实现可以代理给 self._cards 这个 Python 列表(即 list 对象)。

一摞python风格的纸牌(fluent python阅读)相关推荐

  1. python中扑克牌类设计_一摞Python风格的纸牌

    一摞Python风格的纸牌 接下来我会用一个非常简单的例子来展示如何实现 getitme 和 len 这两个特殊方法,通过这个例子我们也能见识到特殊方法的强 大. 示例 1-1 里的代码建立了一个纸牌 ...

  2. 1-1 一摞有风格的纸牌之一摞

    写在前面 昨天学习了怎么用namedtuple()方法生成一张纸牌的类.今天继续学习怎么生成一摞纸牌. 一摞有风格的纸牌之一摞 流畅的Python中给出的第一个例子是一摞有序的纸牌: import c ...

  3. 1-1 一摞有风格的纸牌之一张纸牌

    写在前面 流畅的Python第一章的主题是讲数据模型.Python中的数据模型是指什么呢?Honestly,我也不知道. 虽然潜意识中认为所谓数据模型是指对数据的处理及构建,那具体的处理和构建方式又是 ...

  4. python抽样不同花色纸牌_Python 数据模型 一摞Python风格的纸牌

    定义一个纸牌类 import collections Card = collections.namedtuple('Card', ['rank', 'suit']) class FrenchDeck: ...

  5. python cookbook 豆瓣_学习python求推荐一波书籍?

    豆瓣最受好评的20本Python书 No.1 Fluent Python(豆瓣评分:9.6)Many programmers who learn Python basics fall into the ...

  6. 一摞Python风格的麻将

    一摞Python风格的麻将-1 对于一个从JAVA过渡过来的Python 使用者,我很有一段时间对len(collection)而不是collection.len()这种写法感到不适.随着理解的深入, ...

  7. fluent python epub_Fluent Python, LineItem 进化路线

    Fluent Python 是我这两个月一直在看的 Python 学习材料,这是一本很好的 Python 进阶书. 我的评论是:举例非常细致, 几乎全部是可以直接运行的 Python 代码, 而且是很 ...

  8. 【社区图书馆】Fluent Python

    前言 一.亮点及感受 二.总结 前言: <Fluent Python>从语言设计实现层面给你一些解释,这本书会对这些细节剖析的很到位,还会告诉你一些不踩不能理解的坑儿的成因和解决办法.其他 ...

  9. python代码怎么写出色_如何写出更具有Python风格的代码,五分钟教会你!

    我们都喜欢 Python,因为它让编程和理解变的更为简单.但是一不小心,我们就会忽略规则,以非 Pythonic 方式编写一堆垃圾代码,从而浪费 Python 这个出色的语言赋予我们的优雅.Pytho ...

最新文章

  1. 【网络流24题】解题报告:K、航空路线问题(最小费用最大流)
  2. DedeCMS实现自定义表单提交后发送指定QQ邮箱法
  3. 从SD-WAN向SD-Branch过渡需要多久?—Vecloud
  4. 深度学习实战:基于bilstm或者dialated convolutions做NER
  5. linux sudo 版本,Linu下如何升级当前sudo版本
  6. java file 字符串_Java读取一个文本文件拼接成一个字符串(readFileToString)
  7. 保密作战--在网络上隐藏自己
  8. 英伟达美女工程师:AI从业者要不要读博?要不要自己创业?
  9. 小议jQuery插件开发
  10. centos freeradius mysql_CentOS 5.7安装FreeRADIUS 1.1.3+MySQL 5.0.77结合RouteOS
  11. iOS 上架App Store 遇到的坑
  12. java-php-python-ssm演唱会购票系统计算机毕业设计
  13. jQuery的下载与基本使用
  14. W806-ADC-PWM-TIM尝鲜
  15. word插入图片显示不全
  16. 麻省理工大学线性代数1806(2)消元法及矩阵消元法 矩阵行变换、列变换 置换矩阵 逆矩阵 如沐春风、如饮甘露、醍醐灌顶的线性代数
  17. 右中秋夜大观园即景联句三十五韵
  18. BL101助力于采集光伏电流电压
  19. java zip4j,Java引入zip4j解压缩处理
  20. CAA开发之工程图---工程图开发自定义核心函数 1

热门文章

  1. TeX行间公式与行内公式
  2. 浅谈Altera和Xilinx的FPGA区别
  3. OpenCV利用鼠标操作测量角度
  4. Pycharm 远程debug项目配置
  5. 大商创小程序源码_小程序直播系统有哪些基本功能
  6. 2022(秋)工程伦理答案 第一章
  7. python或c++编写一个文件传输工具
  8. 解决Cookie乱码问题
  9. 塔望 - 食品品牌咨询 食品品牌全案策划服务公司
  10. Vista和DirectX 10(转载)