双下方法: 两个下划线开始并结束的方法 如__init__ , __getitem__方法
问题 :对于python中的List类,我们可以通过len([1,2,3])获取长度,这是获取python内置的数据结构的长度,那如果对于自定义的类,要怎么获取长度呢?
对于这个问题,我们要知道,在python遇到特殊语法时,会使用特殊方法去激活对象的操作,这些特殊方法就是python中的双下方法。比如_len_ ,和_getitem_
因此对于自定义类,我们要让对象具有具有len, in, for等能力, 就要实现对应的_len__, __contains_, __iter___方法
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 suit in self.suits
for rank in self.ranks]
def __len__(self):
"""返回纸牌长度
"""
return len(self._cards)
def __getitem__(self, position):
"""可以获取某个位置的指派
"""
return self._cards[position]
def __iter__(self):
"""返回纸牌迭代器
"""
return iter(self._cards)
使用:
deck = FrenchDeck()
#获取纸牌长度
print(len(deck))
#通过__getitem__获得纸牌
#获取第一张纸牌
deck[0]
#获取最后一张纸牌
deck[-1]
#遍历纸牌
for card in deck:
print(card)
#通过迭代器获取纸牌
it = iter(deck)
print(next(it))
print(next(it))
以上就是双下方法的使用方式,既然双下方法是由python内置方法调用,所以我们在自定义方法时不可能使用双下划线
除了以上举例的双下方法,还有以下功能可以用过双下方法实现,有兴趣的可以试一下
- 迭代
- 集合类
- 属性访问
- 运算符重载
- 函数和方法的调用
- 对象的创建和销毁
- 字符串表示形式和格式化
- 管理上下文(即 with 块)
本文介绍了len(collection)方法的实质是通过调用类内部的双下方法实现的,理解这点有助于编写python风格的方法
1040

被折叠的 条评论
为什么被折叠?



