1. 程式人生 > >一些內建方法的使用,一個驚豔的小程式,內建方法的一些使用

一些內建方法的使用,一個驚豔的小程式,內建方法的一些使用

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