Python 最好的品质之一是一致性。
魔术方法(magic method)是特殊方法的昵称。特殊方法也叫双下方法。
1.1 一摞Python风格的纸牌
1 import collections 2 Card = collections.namedtuple('Card', ['rank', 'suit']) # 创建了一个有名字的元组 3 4 5 class FrenchDeck: # 隐式继承了Object类 6 ranks = [str(n) for n in range(2, 11)] + list('JQKA') # 可选的序号 7 suits = 'spades diamonds clubs hearts'.split() # 可选的花色 8 9 def __init__(self): # 创建该类的对象时,会执行此方法 10 self._cards = [Card(rank, suit) for suit in self.suits 11 for rank in self.ranks] 12 13 def __len__(self): # 调用 len(deck) 时,实际上是执行 len.__len__ 方法 14 return len(self._cards) 15 16 def __getitem__(self, position): # 调用 deck[0] 时,实际上是执行 deck.__getitem__(key=0) 17 return self._cards[position] 18 19 20 deck = FrenchDeck() 21 print(len(deck)) # 判断个数的定义,是由__len__实现的 22 print(deck[0]) # 根据位置抽取,此方法是由__getitem__实现的
通过实现特殊方法来利用 Python 数据模型的两个好处 :
1. 作为你的类的用户,他们不必去记住标准操作的各式名称(“怎么得到元素的总数? 是 .size() 还是 .length() 还是别的什么? ”)。
2. 可以更加方便地利用 Python 的标准库,比如 random.choice 函数,从而不用重新发明轮子。