自Python2.6开始,namedtuple就加入到Python里,用以构建只有少数属性但是没有方法的对象,比如数据库条目。
1 2 3 4 5 6
| from collections import namedtuple
Card = namedtuple("Card", ["rank", "suit"]) beer_card = Card['7', 'diamonds'] beer_card.rank beer_card.suit
|
使用实例: 创建一摞纸牌
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| import collections Card = collections.namedtuple("Card", ["rand", "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.suits for rank in self.ranks] def __len__(self): return len(self._cards) def __getitem__(self, position): return self._cards[position]
deck = FrenchDeck() len(deck) deck[0]
from random import choice choice(deck)
|
上面创建纸牌的代码可以说是非常的pythonic了,首先使用collections.namedtuple创建一个纸牌对象,然后创建一个套牌类。 套牌类初始方法创建了52张牌。
特殊方法(under under method), len()的实现使得我们可以直接使用len()函数去测量对象的尺寸;getitem()函数则使我们可以方便的获取元素,并且支持切片,支持迭代(包括反向迭代)