一摞python风格的纸牌(fluent python阅读)
这一节会展示如何实现__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阅读)相关推荐
- python中扑克牌类设计_一摞Python风格的纸牌
一摞Python风格的纸牌 接下来我会用一个非常简单的例子来展示如何实现 getitme 和 len 这两个特殊方法,通过这个例子我们也能见识到特殊方法的强 大. 示例 1-1 里的代码建立了一个纸牌 ...
- 1-1 一摞有风格的纸牌之一摞
写在前面 昨天学习了怎么用namedtuple()方法生成一张纸牌的类.今天继续学习怎么生成一摞纸牌. 一摞有风格的纸牌之一摞 流畅的Python中给出的第一个例子是一摞有序的纸牌: import c ...
- 1-1 一摞有风格的纸牌之一张纸牌
写在前面 流畅的Python第一章的主题是讲数据模型.Python中的数据模型是指什么呢?Honestly,我也不知道. 虽然潜意识中认为所谓数据模型是指对数据的处理及构建,那具体的处理和构建方式又是 ...
- python抽样不同花色纸牌_Python 数据模型 一摞Python风格的纸牌
定义一个纸牌类 import collections Card = collections.namedtuple('Card', ['rank', 'suit']) class FrenchDeck: ...
- python cookbook 豆瓣_学习python求推荐一波书籍?
豆瓣最受好评的20本Python书 No.1 Fluent Python(豆瓣评分:9.6)Many programmers who learn Python basics fall into the ...
- 一摞Python风格的麻将
一摞Python风格的麻将-1 对于一个从JAVA过渡过来的Python 使用者,我很有一段时间对len(collection)而不是collection.len()这种写法感到不适.随着理解的深入, ...
- fluent python epub_Fluent Python, LineItem 进化路线
Fluent Python 是我这两个月一直在看的 Python 学习材料,这是一本很好的 Python 进阶书. 我的评论是:举例非常细致, 几乎全部是可以直接运行的 Python 代码, 而且是很 ...
- 【社区图书馆】Fluent Python
前言 一.亮点及感受 二.总结 前言: <Fluent Python>从语言设计实现层面给你一些解释,这本书会对这些细节剖析的很到位,还会告诉你一些不踩不能理解的坑儿的成因和解决办法.其他 ...
- python代码怎么写出色_如何写出更具有Python风格的代码,五分钟教会你!
我们都喜欢 Python,因为它让编程和理解变的更为简单.但是一不小心,我们就会忽略规则,以非 Pythonic 方式编写一堆垃圾代码,从而浪费 Python 这个出色的语言赋予我们的优雅.Pytho ...
最新文章
- 【网络流24题】解题报告:K、航空路线问题(最小费用最大流)
- DedeCMS实现自定义表单提交后发送指定QQ邮箱法
- 从SD-WAN向SD-Branch过渡需要多久?—Vecloud
- 深度学习实战:基于bilstm或者dialated convolutions做NER
- linux sudo 版本,Linu下如何升级当前sudo版本
- java file 字符串_Java读取一个文本文件拼接成一个字符串(readFileToString)
- 保密作战--在网络上隐藏自己
- 英伟达美女工程师:AI从业者要不要读博?要不要自己创业?
- 小议jQuery插件开发
- centos freeradius mysql_CentOS 5.7安装FreeRADIUS 1.1.3+MySQL 5.0.77结合RouteOS
- iOS 上架App Store 遇到的坑
- java-php-python-ssm演唱会购票系统计算机毕业设计
- jQuery的下载与基本使用
- W806-ADC-PWM-TIM尝鲜
- word插入图片显示不全
- 麻省理工大学线性代数1806(2)消元法及矩阵消元法 矩阵行变换、列变换 置换矩阵 逆矩阵 如沐春风、如饮甘露、醍醐灌顶的线性代数
- 右中秋夜大观园即景联句三十五韵
- BL101助力于采集光伏电流电压
- java zip4j,Java引入zip4j解压缩处理
- CAA开发之工程图---工程图开发自定义核心函数 1