单下划线
类中带有下划线的名称仅是为了向其他程序员表明该属性或方法旨在私有。但是,名称本身并没有做任何特别的事情。
引用PEP-8:
_single_leading_underscore:“内部使用”指标较弱。例如
from M import *,不导入名称以下划线开头的对象。
双下划线(名称改写)
从Python文档:
形式上的任何标识符
__spam(至少两个前导下划线,至多一个尾随下划线)在文本上均被替换为
_classname__spam,其中
classname,当前类名已去除前导下划线。进行这种修饰时无需考虑标识符的语法位置,因此可用于定义类私有实例和类变量,方法,全局变量中存储的变量,甚至实例中存储的变量。在其他类的实例上对此类私有。
和来自同一页面的警告:
名称修饰旨在为类提供一种轻松的方法,以定义“私有”实例变量和方法,而不必担心派生类定义的实例变量或类外部代码对实例变量的处理。请注意,修改规则主要是为了避免发生意外。坚定的灵魂仍然有可能访问或修改被视为私有的变量。
例
>>> class MyClass():... def __init__(self):... self.__superprivate = "Hello"... self._semiprivate = ", world!"...>>> mc = MyClass()>>> print mc.__superprivateTraceback (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!


