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.
作为一个起点,您可能会发现来自PEP 8 - Style Guide For Python Code的这段引文很有帮助:
不过,您是在类属性的上下文中询问的,所以让我们看看您的具体示例:
单前导下划线
在类中命名属性
self._var1
向类的用户表明,该属性只能由类的内部(或者可能是子类的内部)访问,它们不需要直接访问该属性,也可能不应该修改它。您应该在Java或C中使用private
或protected
字段的相同位置使用前导下划线,但请注意,该语言实际上并没有强制非访问-相反,您信任类的用户不会做任何愚蠢的事,并让他们选择访问(或修改)类的私有字段(如果他们是真的,真的很确定他们知道自己在做什么,这是有道理的。单前导和尾随下划线
self._var1_
不是我见过的。我认为这种命名方式在Python世界中没有任何传统意义。双前导下划线
这个词实际上有语法意义。从类范围内引用
self.__var1
将调用name mangling。在类之外,变量将显示在self._YourClassName__var1
而不是self.__var1
。不是每个人都用这个——我们根本不在我工作的地方——对于简单的类来说,使用一个单独的前导下划线让人觉得有点荒谬和恼人。但是,它的存在是有理由的;如果您使用大量继承,如果您只使用一个前导下划线,那么您就没有办法向阅读您的代码的人指出“private”和“protected”变量之间的区别-那些甚至不打算被子类访问的变量,以及那些子类可能进入,但外界可能不会。因此,在这种情况下,使用单个尾随下划线表示“protected”,使用双下划线表示“private”可能是一个有用的约定(名称损坏将允许子类在其子类中使用同名的变量,而不会导致冲突)。
双前导和尾随下划线
self.__var1__
是不应该像我写的那样创建的,因为双前导和尾随下划线命名样式只用于具有Python定义的特殊含义的名称,比如类的__init__
或__eq__
方法。您可以自由地重写它们来更改类的行为(实际上,几乎所有类都有一个程序员定义的__init__
),但是您不应该像self.__var1__
那样用这种样式来组合自己的名称。相关问题 更多 >
编程相关推荐