本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
The meaning of a single- and a double-underscore before an object name in Python
我想知道这些在Python中的区别是什么?
self._var1
self._var1_
self.__var1
self.__var1__
可能重复:stackoverflow.com/questions/1301346/…和stackoverflow.com/questions/935378/…
作为一个起点,您可能会从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__那样使用自己的名字。
文件中也有详细说明。
"单个前导和尾随下划线":这在某些项目中用作用户可修改的特殊方法等价物的约定。例如,我们在Sage中使用它。我在别处也看到过,尽管我想不出一个现成的例子。
双前导下划线的最后三行应相反:单下划线=私有,双下划线=受保护
@阿米特梅里不,那完全是错误的。名称管理使得不可能使用双下划线方法作为保护。