想要实现一个抽牌的功能,有很多种实现方法,这时候我们创造一个对象,通过内置方法来完成这个功能:
# Author:Zhang Zhao# -*-coding:utf-8-*-from collections import namedtupleCard = namedtuple('card',['rank','suit']) #创建一个元组,具有名字import jsonclass FranchDeck(object): rank = [str(i) for i in range(2,11)] + list('JQKA') #代表牌的大小,字符串类型 suit = ['红心','方板','黑桃','梅花'] #代表牌的花色 def __init__(self): self._cards = [Card(rank,suit) for rank in FranchDeck.rank for suit in FranchDeck.suit] #创建一副牌,没有大小王 def __getitem__(self, item): #抽牌运用random中的chioce方法,需要的元素有字典还有长度 return self._cards[item] def __len__(self): return len(self._cards) def __setitem__(self, key, value):#洗牌需要用到 self._cards[key] = value def __str__(self): return json.dumps(self._cards,ensure_ascii=False)#打印牌为列表,但__str__方法打印的是字符串格式,需要进行序列化a = FranchDeck()from random import choiceprint(choice(a))print(choice(a))print(a[4])print(a)from random import shuffleshuffle(a)print(a[4])
同时拓展一下,如果要实现一个人员信息统计,但是每年人员的姓名性别等信息不会变,变的只是年龄等信息,那么我们再录入信息的时候,为了防止系统里的对象重复或占用内存空间,我们就需要对信息进行自动录入刷新,这时候,我们就想到了set去重功能,但是,具体怎么实现呢?
# Author:Zhang Zhao# -*-coding:utf-8-*-class A(object): def __init__(self,name,sex,age): self.name = name self.age = age self.sex = sex def __hash__(self): return hash(self.name + self.sex) def __eq__(self, other): if self.name == other.name and self.sex == other.sex: return True return Falsea1 = A('Chen','女',18)a2 = A('Chen','女',28)print(set([a1,a2]))
可以看出,使用set的时候,它需要比较的参数是哈希值同时也需要__eq__的返回值。