我们在创建列表的时候,是实现了一个列表对象,然后len()函数实际上是调用列表类中的私有方法__len__(),用列表索引的时候,实际上是调用了__getitem__()方法
k=[1,2,3]
len(k)
Out[3]: 3
k.__len__()
Out[4]: 3
k[0]
Out[5]: 1
k.__getitem__(0)
Out[6]: 1
下面自己创建一个类,并且实现__len__()和__getitem__()
class FrenchDeck:
ranks = [1,2,3,4,5,6]
suits = 'spades diamonds clubs hearts'.split()
def __init__(self):
self._cards = [(rank, suit) for suit in self.suits
for rank in self.ranks]
def __len__(self):
return len(self._cards)
def __getitem__(self, position):
return self._cards[position]
deck = FrenchDeck()
print('deck.__len__():',deck.__len__())
print('len(deck):',len(deck))
print('deck.__getitem__(0):',deck.__getitem__(0))
print('deck[0]:',deck[0])
输出
deck.__len__(): 24
len(deck): 24
deck.__getitem__(0): (1, 'spades')
deck[0]: (1, 'spades')
这里也可以魔改一下getitem方法
class FrenchDeck:
ranks = [1,2,3,4,5,6]
suits = 'spades diamonds clubs hearts'.split()
def __init__(self):
self._cards = [(rank, suit) for suit in self.suits
for rank in self.ranks]
def __len__(self):
return len(self._cards)
def __getitem__(self, position):
return self._cards[position:position+2]
deck = FrenchDeck()
print('deck.__len__():',deck.__len__())
print('len(deck):',len(deck))
print('deck.__getitem__(0):',deck.__getitem__(0))
print('deck[0]:',deck[0])
魔改后的输出
deck.__len__(): 24
len(deck): 24
deck.__getitem__(0): [(1, 'spades'), (2, 'spades')]
deck[0]: [(1, 'spades'), (2, 'spades')]