python从零开始--36 python内置类属性 __len__ __getitem__ 实现 (补充26节)

在网上看到一个关于实现 __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()

猜你喜欢

转载自blog.csdn.net/Pansc2004/article/details/82907349