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

新手上路,请多包涵

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

原文由 Ram Rachum 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 658
2 个回答

单下划线

在一个类中,带有前导下划线的名称向其他程序员表明该属性或方法打算在该类中使用。但是,隐私不会以任何方式 _强制执行_。对模块中的函数使用前导下划线表示不应从其他地方导入它。

来自 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.__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!'}

原文由 Andrew Keeton 发布,翻译遵循 CC BY-SA 4.0 许可协议

  • _foo :只是一个约定。程序员指示变量是私有的(无论这在 Python 中意味着什么)的一种方式。

  • __foo :这个有实际意义。解释器将此名称替换为 _classname__foo 以确保该名称不会与另一个类中的类似名称重叠。

  • __foo__ :只是一个约定。 Python 系统使用不会与用户名冲突的名称的一种方式。

在 Python 世界中,没有其他形式的下划线有意义。此外,在这些约定中,类、变量、全局等之间没有区别。

原文由 Ned Batchelder 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题