Python 对象名称中的下划线
单下划线
那种仅限从一个对象内部访问的“私有”实例变量在 Python 中并不存在。 但是,大多数 Python 代码都遵循这样一个约定:带有一个下划线的名称 (例如 _spam) 应该被当作是 API 的非仅供部分。
在 Python 中,单下划线用来对命名对象进行私有化,但只是一种约定,实际上是可以在外部调用的,例如:1
2
3
4
5
6class Example():
def __init__(self):
self._info = "Life is short ..." # 单下划线
text = Example()
print(text._info)
1 | Life is short ... |
双下划线
任何形式为 __spam 的标识符(至少带有两个前缀下划线,至多一个后缀下划线)的文本将被替换为 _classname__spam,其中 classname 为去除了前缀下划线的当前类名称。
这个就不像前面那个单下划线命名的 _spam 对象了,这里的双下划线就有了实际作用,解释器会将双下划线命名的对象 __spam 加上其类的名称,以区别和其他类同名的命名,即 _classname__spam,并且不能被外部访问,例如:1
2
3
4
5
6class Example():
def __init__(self):
self.__info = "Life is short ..." # 双下划线
text = Example()
print(text.__info)
1 | Traceback (most recent call last): |
不过使用 text._Example__info 还是可以访问滴!这种加上类名的改写规则的设计主要是为了避免意外冲突;访问或修改被视为私有的变量仍然是可能的。这在特殊情况下甚至会很有用,例如在调试器中。
魔法函数
例如示例当中的 __init__ 也带下划线,这表示是 Python 内部的名字,用来区别其他用户自定义的命名,防止冲突。