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

2022-09-05 00:51:42

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


答案 1

单下划线

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

来自 PEP-8 风格指南:

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

双下划线(名称重整)

来自 Python 文档

该形式的任何标识符(至少两个前导下划线,最多一个尾部下划线)都将在文本上替换为 ,其中当前类名中去除了前导下划线。这种修饰是在不考虑标识符的语法位置的情况下完成的,因此它可用于定义类私有实例和类变量,方法,存储在全局变量中的变量,甚至存储在实例中的变量。在其他类的实例上私有于此类。__spam_classname__spamclassname

以及来自同一页面的警告:

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

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

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

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

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

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