import json from collections import namedtuple # 命名元祖 Card = namedtuple('Card','rank suit') c1 = Card(2,'红心') class FranchDeck: ranks = [str(rank) for rank in range(2,11)] + list('JQKA') suits = ['红心','方块','黑桃','梅花'] def __init__(self): self.__cards = [Card(rank,suit) for rank in FranchDeck.ranks for suit in FranchDeck.suits] def __len__(self): return len(self.__cards) def __getitem__(self, item): # 可以使用调用属性的方式调用self.__cards
return self.__cards[item] def __setitem__(self, key, value): self.__cards[key] = value def __str__(self): return str(self.__cards) deck = FranchDeck() print(deck[0]) # 随机抽牌 用到random 模块的choice # choice方法依赖 len方法,所以实现一个自己的len方法,__len__ from random import choice choice(deck) print(choice(deck)) # 随机洗牌用到random 模块的choice from random import shuffle # 依赖 __setitem__方法 shuffle(deck) print(deck) print(deck[:5]) 另一个例子
# 如果两个人的姓名,性别一致,就认为两个属性相等,去重 class A: def __init__(self,name,sex,age): self.name = name self.sex = sex self.age = age def __eq__(self, other): if self.name == other.name and self.sex == other.sex: return True return False def __hash__(self): return hash(self.name + self.sex) a = A('egg','男',38) b = A('egg','男',37) print(set((a,b)))
结果:{<__main__.A object at 0x00000140AE056F60>} 如果只是使用set集合去重,得不到想要的结果,结果自己实现了,__hash__,__eq__方法,得到了相同的内存地址,证明可以用了, 但是这两个方法,缺一个都不行 这个例子证明了,set集合的去重,应该是使用了,__hash__,__eq__方法,的共同结果