前面和后面带下划线的python属性有什么区别?

What is the difference in python attributes with underscore in front and back

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
The meaning of a single- and a double-underscore before an object name in Python

我想知道这些在Python中的区别是什么?

1
2
3
4
self._var1
self._var1_
self.__var1
self.__var1__


作为一个起点,您可能会从PEP8-Python代码风格指南中找到有用的这句话:

In addition, the following special forms using leading or trailing
underscores are recognized (these can generally be combined with any
case convention):

_single_leading_underscore: weak"internal use" indicator. E.g. from M import * does not import objects whose name starts with an underscore.

single_trailing_underscore_: used by convention to avoid conflicts
with Python keyword, e.g.
Tkinter.Toplevel(master, class_='ClassName')

__double_leading_underscore: when naming a class attribute, invokes name mangling (inside class FooBar, __boo becomes _FooBar__boo; see
below).

__double_leading_and_trailing_underscore__:"magic" objects or attributes that live in user-controlled namespaces. E.g. __init__,
__import__ or __file__. Never invent such names; only use them as documented.

不过,您是在类属性的上下文中询问的,所以让我们来看一下您的具体示例:

单前导下划线

在类中命名一个属性self._var1向类的用户表明,该属性只能由类的内部(或子类的内部)访问,并且它们不需要直接访问它,也可能不应该修改它。你应该在相同的地方使用领先的下划线,你会在Java或C语言中使用EDCOX1 1或EDCOX1 2字段,但是要注意语言实际上并没有强制非访问——相反,你相信你的类的用户不做任何愚蠢的事情,并且让他们选择访问或修改你的类的私有字段。E真的,真的确定他们知道自己在做什么,这是有意义的。

单前导和尾随下划线

我从来没有见过self._var1_这种东西。我认为这种命名风格在Python世界中没有任何传统意义。

双前导下划线

这个词实际上具有句法意义。从类范围内引用self.__var1会调用名称管理。从类外部来看,变量似乎位于self._YourClassName__var1而不是self.__var1。不是每个人都用这个——我们根本不在我工作的地方——对于简单的类来说,它感觉像是一个稍微荒谬和恼人的选择,而不是使用一个前导下划线。

但是,它存在一个理由;如果您使用大量继承,如果您只使用一个前导下划线,那么您就没有办法向阅读您的代码的人指示"private"和"protected"变量之间的区别——那些甚至不打算被子类访问的变量,以及子类可能访问的变量。但外界可能不会。因此,在这种情况下,使用单个尾随下划线表示"受保护",使用双下划线表示"私有"可能是一种有用的约定(名称管理允许子类在其子类中使用具有相同名称的变量,而不会导致冲突)。

双前导和尾随下划线

self.__var1__是您不应该创建的东西,因为双前导和尾随下划线命名样式仅用于具有Python定义的特殊含义的名称,如__init____eq__类方法。您可以自由地重写这些代码来更改类的行为(实际上,几乎所有类都有一个程序员定义的__init__),但是您不应该像self.__var1__那样使用自己的名字。