为什么某些函数前后有双下划线"__"?

589 投票
7 回答
424945 浏览
提问于 2025-04-17 09:20

这个“下划线”在Python中似乎经常出现,我想知道这是不是Python语言的一个要求,还是说只是个约定俗成的习惯?

另外,有人能说说哪些函数通常会带下划线吗?能解释一下为什么吗?比如说__init__这个函数。

7 个回答

33

被双下划线包围的名字在Python中是“特殊的”。这些名字在Python语言参考文档的第3部分“数据模型”中有列出。

88

其他回答者说得对,前面和后面都有两个下划线的命名方式是用来表示“特殊”或“魔法”方法的。

虽然你可以直接调用这些方法(比如 [10, 20].__len__()),但下划线的存在其实是在暗示这些方法是为了间接调用而设计的(比如 len([10, 20]))。大多数 Python 操作符都有对应的“魔法”方法(例如,a[x] 是调用 a.__getitem__(x) 的常用方式)。

790

来自于 Python PEP 8 -- Python代码风格指南

描述性:命名风格

以下是一些特殊的命名方式,它们使用了前导或后缀下划线(这些通常可以和任何大小写规则结合使用):

  • _single_leading_underscore:表示“内部使用”的弱指示符。例如,from M import * 不会导入以下划线开头的对象。

  • single_trailing_underscore_:按照约定使用,以避免与Python关键字冲突,例如:

    Tkinter.Toplevel(master, class_='ClassName')

  • __double_leading_underscore:在命名类属性时,会触发名称改名(在类 FooBar 内,__boo 会变成 _FooBar__boo;见下文)。

  • __double_leading_and_trailing_underscore__:表示“魔法”对象或属性,它们存在于用户控制的命名空间中。例如 __init____import____file__。切勿自己创造这样的名称;只使用文档中说明的名称。

需要注意的是,带有双前导和后缀下划线的名称基本上是保留给Python本身的:“切勿自己创造这样的名称;只使用文档中说明的名称”。

撰写回答