第十章 - 序列的修改、散列和切片
序列的修改、散列和切片
基本的序列协议 —— __len__ 和 __getitem__
什么是协议:
在面向对象编程中,协议是非正式的接口,只在文档中定义,在代码中不定义。例如Python的序列协议只需要__len__和__getitem__两个方法。任何类只要使用标准的签名和语义实现了这两个方法,就能用在任何期待序列的地方。这也叫鸭子类型。
实现__len__ 和 __getitem__
import collections Card = collections.namedtuple("Card", ["rank", "suit"])
class Poker(object): 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.suits for rank in self.ranks] def __len__(self): return len(self._cards) def __getitem__(self, item): return self._cards[item] pokers = Poker() print(len(pokers)) >>> 52 print(pokers[10]) >>> Card(rank='Q', suit='spades')