代码之家  ›  专栏  ›  技术社区  ›  Community wiki

对象名称前的单下划线和双下划线的含义是什么?

  •  1795
  • Community wiki  · 技术社区  · 1 年前

    在Python中,对象名称前的单下划线和双下划线代表什么?

    18 回复  |  直到 2 年前
        1
  •  0
  •   Karim Baidar    2 年前

    单底芯

    在类中,带前导下划线的名称向其他程序员指示该属性或方法打算在该类中使用。然而,隐私不是 强制执行的 无论如何。 对模块中的函数使用前导下划线表示不应该从其他地方导入。

    来自 PEP-8 样式指南:

    _single_leading_underscore :弱“内部使用”指示器。例如。 from M import * 不导入名称以下划线开头的对象。

    Double Undercore(Name Mangling)

    从…起 the Python docs :

    表单的任何标识符 __spam (至少两个前导下划线,最多一个尾随下划线)在文本上替换为 _classname__spam 哪里 classname 是去掉了前导下划线的当前类名。这种篡改是在不考虑标识符的语法位置的情况下进行的,因此它可以用于定义类私有实例和类变量、方法、存储在全局变量中的变量,甚至存储在实例中的变量。在其他类的实例上对此类是私有的。

    来自同一页面的警告:

    名称篡改旨在为类提供一种简单的方法来定义私有实例变量和方法,而不必担心派生类定义的实例变量,也不必担心类外代码处理实例变量。请注意,损毁规则的设计主要是为了避免事故; 坚定的灵魂仍然有可能访问或修改被认为是私有的变量。

    实例

    >>> 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!'}