【Python】Python中的下划线
单下划线(如: _var):
使用单下划线,用于指定该名变量或函数属性为“私有”。这仅仅是一个惯例,不是强制规定。用于向其他程序员表明这个变量或函数仅仅供内部使用,外部不要访问它。但实际上外部还是可以访问。
在类中,单下划线开始的成员变量是保护变量,意思是只有类对象和子类对象才能访问;“双下划线”开始的私有成员,意思是只有类对象自己能访问,连子类对象也不能访问。
一个例外是,假设在当前模块module1中使用单下划线声明了一个变量_var。在其他模块中,使用import module1 或者 from module1 import *并不会导入_var的名称。使用from module1 import _var才生效。(Python 2.7.10)
名称前双下划线(如: __var)
名称(具体为一个方法名)前双下划线(__)的用法并不是一种惯例,对解释器来说它有特定的意义。Python中的这种用法是为了避免与子类定义的 名称冲突。Python文档指出,“__spam”这种形式(至少两个前导下划线,最多一个后续下划线)的任何标识符将会被 “_classname__spam”这种形式原文取代,在这里“classname”是去掉前导下划线的当前类名。例如下面的例子:
1
2
3
4
5
6
7
8
|
>>> class A( object ): ... def _internal_use( self ): ... pass ... def __method_name( self ): ... pass ... >>> dir (A()) [ '_A__method_name' , ..., '_internal_use' ] |
正如所预料的,“_internal_use”并未改变,而“__method_name”却被变成了“_ClassName__method_name”。此时,如果你创建A的一个子类B,那么你将不能轻易地覆写A中的方法“__method_name”。
1
2
3
4
5
6
|
>>> class B(A): ... def __method_name( self ): ... pass ... >>> dir (B()) [ '_A__method_name' , '_B__method_name' , ..., '_internal_use' ] |
这里的功能几乎和Java中的final方法和C++类中标准方法(非虚方法)一样。
同样地,假设在当前模块module1中使用单下划线声明了一个变量__var。在其他模块中,使用import module1 或者 from module1 import *并不会导入__var的名称。使用from module1 import __var才生效。(Python 2.7.10)
名称前后的双下划线(如:__init__)
这种用法表示Python中特殊的方法名。其实,这只是一种惯例,对Python系统来说,这将确保不会与用户自定义的名称冲突。通常,你将会覆写 这些方法,并在里面实现你所需要的功能,以便Python调用它们。例如,当定义一个类时,你经常会覆写“__init__”方法。
虽然你也可以编写自己的特殊方法名,但不要这样做。
1
2
3
4
5
6
|
>>> class C( object ): ... def __mine__( self ): ... pass ... >>> dir (C) ... [..., '__mine__' , ...] |
其实,很容易摆脱这种类型的命名,而只让Python内部定义的特殊名称遵循这种约定。
参考文献:
1. http://www.zhihu.com/question/19754941
2. http://python.jobbole.com/81129/
3. http://www.chengxuyuans.com/Python/67370.html