使用namedtupe构建没有方法的对象

自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) #output: 52
deck[0] #output: Card(rank='2', suit='spades')

from random import choice
choice(deck)#随机抽取一张牌

上面创建纸牌的代码可以说是非常的pythonic了,首先使用collections.namedtuple创建一个纸牌对象,然后创建一个套牌类。 套牌类初始方法创建了52张牌。

特殊方法(under under method), len()的实现使得我们可以直接使用len()函数去测量对象的尺寸;getitem()函数则使我们可以方便的获取元素,并且支持切片,支持迭代(包括反向迭代)

文章目录
  1. 1. 使用实例: 创建一摞纸牌