如书中所言,python拥有一致性。
整个的框架:
迭代
集合类
属性访问
运算符重载
函数和方法的调用
对象的创建和销毁
字符串表示形式和格式化
管理上下文(with语句)
开篇提到了__getitem__和__len__方法,看下面的示例代码
import collections
Card = collections.namedtuple('Card', ['rank', 'suit'])
class FrenDeck:
ranks = [str(n) for n in range(2,11)] + list('JQKA')
suits = 'a b c d'.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]
beer_card = Card('7', 'da')
beer_card
Out[3]: Card(rank='7', suit='da')
namedtuple主要是用来构建只有少数属性但没有方法的类
card = FrenDeck()
对上面这个类实例化
len(card)
Out[6]: 52
也就是说有了__len__这个方法,重载了len方法,在这上面做一下修改:
def __len__(self):
return 10
这个时候
len(card)
Out[12]: 10
由此可见一般python和其他语言的方法的不同,比如java是通过a.length()来判断长度这个体现了python的语言特性
和这个相似的方法有
__getitem__:这样就可以迭代了以及切片了
__contains__:in运算符就有意义了
这些特殊方法的使用
1.这是为了给python解释器调用,而不是自己的类调用,而这个是你自定义的类,会如上所示,会使用你的__len__方法
2.如果len这个是python内置类型,会直接调用PyVarObject里的ob_size
3.不要随意调用这些特殊方法
通过实现特殊方法,可以使得你的类和python的内置类型一样