想要實現一個抽牌的功能,有很多種實現方法,這時候我們創造一個對象,通過內置方法來完成這個功能:
# Author:Zhang Zhao # -*-coding:utf-8-*- from collections import namedtuple Card = namedtuple('card',['rank','suit']) #創建一個元組,具有名字 import json class 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 choice print(choice(a)) print(choice(a)) print(a[4]) print(a) from random import shuffle shuffle(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 False a1 = A('Chen','女',18) a2 = A('Chen','女',28) print(set([a1,a2]))
可以看出,使用set的時候,它需要比較的參數是哈希值同時也需要__eq__的返回值。