from collections import namedtuple
import json
Card = namedtuple('Card',['rank','suit'])


class FranchDeck:
ranks = [str(n) for n in range(2,11)]+list('JKQA')
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):
return self._cards[item]

def __setitem__(self, key, value):
self._cards[key] = value

def __str__(self):
return json.dumps(self._cards,ensure_ascii=False)


deck = FranchDeck()
print(deck[0]) # 依赖__getitem__方法

from random import choice
print(choice(deck)) # 依赖__len__方法
print(choice(deck))

from random import shuffle
shuffle(deck) # 依赖__setitem__方法

print(deck) # 依赖__str__方法
print(deck[:5]) # 实现了对象直接切片,依赖item方法

#################################################

100人名字和性别年龄不同,要求过滤名字和性别相同的
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 Ture
    return False

  def __hash__(self):
    return hash(self.name + self.sex)

a = A(...)
b = A(...)
print(set(a,b))  #集合去重依赖hash和eq两种方法