Python内置类型是否具有冗余的特殊方法?

4
在《流畅的Python》一书中提到:
当你写下len(my_object)这样的代码,如果my_object是一个自定义类的实例,那么Python会调用你所实现的__len__方法...
但对于像liststrbytearray等内置类型,解释器会采取一种快捷方式:CPython实现的len()函数实际上返回内存中表示任意可变内置对象的PyVarObject C结构体中的ob_size字段的值。
然而至少这些内置类型中仍然定义了__len__方法...
>>> 'string'.__len__()
6
>>> [1, 2, 3].__len__()
3

这些方法如果不被len调用,它们有何作用?还有其他类似的例子吗?

2
子类化是我想到的一个例子。 - Daniel Roseman
2
Python语言规定,支持len协议的类型定义了__len__。CPython实现可以绕过它(因为它自己定义了内置类型),但其他实现可能仍然选择调用__len__ - chepner
1个回答

1

事实上,CPython实现默认不调用__len__()并不意味着没有任何Python库或用户程序会调用。保持该方法可用是为了API稳定性,即使CPython尽可能采取捷径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接