1。通过实现特殊方法,自定义类型可以表现得像内置类型;以下代码实现了len和getitem,它们可以使自定义类型的行为类似于列表。importcollectionsfromrandomimportchoiceCard=collections.namedtuple('Card',['rank','suit'])类FrenchDeck:ranks=[str(n)forninrange(2,11)]+list('JQKA')suits='黑桃方块红心'.split()def__init__(self):self._cards=[Card(rank,suit)forrankinself.ranksforsuitinself.suits]def__len__(self):returnlen(self._cards)def__getitem__(self,position):返回self._cards[position]suit_values=dict(spades=3,hearts=2,diamonds=1,clubs=0)defspade_hith(card):rank_value=FrenchDeck.ranks.index(card.rank)#print(rank_value)#print(suit_values[card.suit])returnrank_value*len(suit_values)+suit_values[card.suit]if__name__=='__main__':deck=FrenchDeck()#card=choice(deck)#print(card)forcardinsorted(deck,key=spade_hith):print(str(card))print(repr(card))2、repr和str(1)__repr__所返回的字符串应准确(%r),无错,并且尽它可能会用代码表达如何创建创建的对象,例如repr(v);outputVector(3,4)(2)__str__在调用str函数时调用(%s),或者打印一个对象时调用,比如str(v);output(3,4)(3)当默认实现打印对象时,两者没有区别(4)两个特殊的方法,当你只想实现一个时,__repr__是更好的选择,因为如果一个对象确实没有__str__函数,python解释器需要调用它,它将使用__repr__代替
