共计 1046 个字符,预计需要花费 3 分钟才能阅读完成。
1、通过实现非凡办法,自定义类型能够体现的跟内置类型一样;
如下代码,实现 len, getitem,可使自定义类型体现得如同列表一样。
import collections | |
from random import choice | |
Card = 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__代替。
正文完