在网上看到一个关于实现 __len__ __getitem__的代码,稍微修改了一下,刚好作为26节内置类属性的补充。
代码说明:
1. 定义一稿Card具名元组,用来存放扑克点数和花色的组合,FrenchDeck初始化后,刚好是52组数据
2. __len__实现了len(obj)的用法,所以下面可以直接使用len(deck)
3.__getitem__其实实现的是通过索引返回数据的功能,就是列表、元组常用的功能,一旦类实现了这个方法,就可以在这个类的对象上使用 obj[xxx]的写法,很方便的读取数据。
import collections
Card = collections.namedtuple('Card',['rank','suit']) #具名元组
class FrenchDeck:
ranks = [str(n) for n in range(2,11)] + list('JQKA') #牌数
suits = 'spades hearts clubs diamonds'.split() # 牌色
def __init__(self): # 初始化
self._cards = [Card(rank, suit) for rank in self.ranks
for suit in self.suits]
def __len__(self): # 用len取长度的特殊方法
return len(self._cards)
def __getitem__(self, item): # 用索引取值的特殊方法
try:
return self.cards[item]
except (IndexError, TypeError):
print("Please input an int number between -52~51 including -52 & 51.")
def printAllitem(self):
for item in self._cards:
print(item)
if __name__ == "__main__":
deck = FrenchDeck()
print("There are total {} cards.".format(len(deck)))
print("The third card is: {}".format(deck[2]))
print("\nPrint all cards as below:")
deck.printAllitem()