关于len,
如果x是一个内置类型的实例,那么len(x)的速度回非常快,背后的原因是CPython会直接从一个C结构体里读取对象的长度,完全不用调用任何方法,获取一个集合中的元素的数量是一个很常见的操作,在strlistmemoryview等类型上,这个操作必须高效。
换句话说,len之所以不是一个普通方法,是为了让Python自带的数据结构可以走后门,abs也是同理。
但是多亏了他是特殊方法,我们也可以把len用于自定义数据类型。这种处理方式在保持内置类型的效率和保证语言的一致性之间找到了一个平衡点,也印证了Python之禅中的另外一句话:不能让特例特殊到开始破坏既定规则。
关于__repr__ /__str__
Python对象的一个基本要求就是他的有合理的字符串表示形式,我们可以通过__repr__和__str__来满足这个要求,前者方便我们调试和记录日志,后者则是给终端用户看的。这就是数据模型中存在这两个特殊方法的原因。