我正在读一本关于Python的书,它说当你打电话给help(obj)
列出所有可以在obj
上调用的方法时,那些方法是两边都被__
包围的私有助手方法是无法调用的。
但是,列出的字符串方法之一是__len__
,您可以验证如果s
是某个字符串,则在Python中输入s.__len__()
会返回{{1}的长度}。
为什么可以调用其中一些方法,例如s
,但其他方法无法调用?
答案 0 :(得分:9)
这本书不正确。您可以直接调用__dunder__
特殊方法;所有关于它们的特殊之处在于它们在Python中的文档化使用以及语言本身如何使用它们。
大多数代码都不应该直接调用它们并将它留给Python来调用它们。例如,使用len()
函数而不是在对象上调用__len__
方法。
该语言保留所有这些名称供自己使用;请参阅参考文档中的Reserved classes of identifiers:
系统定义的名称。这些名称由解释器及其实现(包括标准库)定义。当前系统名称在Special method names部分和其他地方进行了讨论。更多可能会在未来的Python版本中定义。 任何使用
__*__
名称,在任何情况下,如果没有明确记录使用,都会在没有任何警告的情况下破损。