1、通过实现非凡办法,自定义类型能够体现的跟内置类型一样;

如下代码,实现len, getitem,可使自定义类型体现得如同列表一样。

import collectionsfrom random import choiceCard = collections.namedtuple('Card', ['rank', 'suit'])class FrenchDeck:    ranks = [str(n) for n in range(2, 11)] + list('JQKA')    suits = 'spades diamonds clubs hearts'.split()    def __init__(self):        self._cards = [Card(rank, suit) for rank in self.ranks                       for suit in self.suits]    def __len__(self):        return len(self._cards)    def __getitem__(self, position):        return self._cards[position]suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)def spade_hith(card):    rank_value = FrenchDeck.ranks.index(card.rank)    # print(rank_value)    # print(suit_values[card.suit])    return rank_value * len(suit_values) + suit_values[card.suit]if __name__ == '__main__':    deck = FrenchDeck()    #card = choice(deck)    #print(card)    for card in sorted(deck, key=spade_hith):        print(str(card))        print(repr(card))

 2、repr和str

(1) __repr__所返回的字符串应该精确(%r),无歧义,并且尽可能表白出如何用代码创立出这个被创立的对象,如repr(v);输入Vector(3, 4)

(2) __str__在str函数被调用(%s),或者打印一个对象的时候被调用,如str(v);输入(3,4)

(3)默认实现打印对象时,两者没有什么区别

(4)两个非凡办法,只想实现一个时,__repr__是更好的抉择,因为如果一个对象没有__str__函数,而python解释器又须要调用时,会用__repr__代替。