为什么某些函数前后有双下划线"__"?
这个“下划线”在Python中似乎经常出现,我想知道这是不是Python语言的一个要求,还是说只是个约定俗成的习惯?
另外,有人能说说哪些函数通常会带下划线吗?能解释一下为什么吗?比如说__init__
这个函数。
7 个回答
被双下划线包围的名字在Python中是“特殊的”。这些名字在Python语言参考文档的第3部分“数据模型”中有列出。
其他回答者说得对,前面和后面都有两个下划线的命名方式是用来表示“特殊”或“魔法”方法的。
虽然你可以直接调用这些方法(比如 [10, 20].__len__()
),但下划线的存在其实是在暗示这些方法是为了间接调用而设计的(比如 len([10, 20])
)。大多数 Python 操作符都有对应的“魔法”方法(例如,a[x]
是调用 a.__getitem__(x)
的常用方式)。
来自于 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本身的:“切勿自己创造这样的名称;只使用文档中说明的名称”。