单下划线
在一个类中的方法或属性用单下划线开头就是告诉别的程序这个属性或方法是私有的。然而对于这个名字来说并没有什么特别的。
引自PEP-8:
单下划线:"内部使用"的弱指示器。比如,from M import * 将不会引进用但下划线开头的对象。
双下划线
来自Python文档:
任何
__spam
形式(至少两个下划线开头,至多一个下划线结尾)都是代替_classname__spam
,其中classname是当前类的名字。This mangling is done without regard to the syntactic position of the identifier。所以它能用来定义私有类的实例和类变量,方法,在全局中的变量,甚至是实例中的变量。可以区别不同类的实例。
例子
>>> class MyClass():
... def __init__(self):
... self.__superprivate = "Hello"
... self._semiprivate = ", world!"
...
>>> mc = MyClass()
>>> print mc.__superprivate
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AttributeError: myClass instance has no attribute '__superprivate'
>>> print mc._semiprivate
, world!
>>> print mc.__dict__
{'_MyClass__superprivate': 'Hello', '_semiprivate': ', world!'}
总结:
__foo__
:一种约定,Python内部的名字,用来区别其他用户自定义的命名,以防冲突。
_foo
:一种约定,用来指定变量私有。程序员用来指定私有变量的一种方式。
__foo
:这个有真正的意义:解析器用_classname__foo
来代替这个名字,以区别和其他类相同的命名。
在Python中没有其他形式的下划线了。
这种约定方式和类,变量,全局变量等没有区别。
_name 不能用'from moduleimport *'导入
__name__ 系统定义名字
__xxx 类中的私有变量名
- 因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号
- 变量名_xxx被看作是“私有 的”,在模块或类外不可以使用。当变量是私有的时候,用_xxx 来表示变量是很好的习惯。因为变量名xxx对python 来说有特殊含义,对于普通的变量应当避免这种命名风格。
- “单下划线开头” 的成员变量叫做保护变量,意思是只有类对象和子类对象才能访问到这些变量。
- “双下划线开头” 的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。
- 以单下划线开头(_func)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from name import *”而导入;以双下划线开头的(func)代表类的私有成员;以双下划线开头和结尾的(__foo)代表python里特殊方法专用的标识,如 init(),del( ), new这些代表类的构造函数。
1、_name 不能用于’from module import *’ 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。
2、__name 双下划线的表示的是私有类型的变量。只能是允许这个类本身进行访问了。连也是子类也不可以的。
3、name_ 定义的是特列方法。像init、del之类。