一些内置方法的使用,一个惊艳的小程序,内置方法的一些使用

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__方法,的共同结果








猜你喜欢

转载自www.cnblogs.com/bozhengheng/p/10259793.html
今日推荐