在《流畅的Python》一书中提到:
当你写下
但对于像
然而至少这些内置类型中仍然定义了
这些方法如果不被
当你写下
len(my_object)
这样的代码,如果my_object
是一个自定义类的实例,那么Python会调用你所实现的__len__
方法...但对于像
list
、str
、bytearray
等内置类型,解释器会采取一种快捷方式:CPython实现的len()
函数实际上返回内存中表示任意可变内置对象的PyVarObject
C结构体中的ob_size
字段的值。然而至少这些内置类型中仍然定义了
__len__
方法...>>> 'string'.__len__()
6
>>> [1, 2, 3].__len__()
3
这些方法如果不被
len
调用,它们有何作用?还有其他类似的例子吗?
len
协议的类型定义了__len__
。CPython实现可以绕过它(因为它自己定义了内置类型),但其他实现可能仍然选择调用__len__
。 - chepner