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

2024-05-14 22:48:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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__

Tags: andofthenameselfanobjectdouble
1条回答
网友
1楼 · 发布于 2024-05-14 22:48:32

作为一个起点,您可能会发现来自PEP 8 - Style Guide For Python Code的这段引文很有帮助:

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中使用privateprotected字段的相同位置使用前导下划线,但请注意,该语言实际上并没有强制非访问-相反,您信任类的用户不会做任何愚蠢的事,并让他们选择访问(或修改)类的私有字段(如果他们是真的,真的很确定他们知道自己在做什么,这是有道理的。

单前导和尾随下划线

self._var1_不是我见过的。我认为这种命名方式在Python世界中没有任何传统意义。

双前导下划线

这个词实际上有语法意义。从类范围内引用self.__var1将调用name mangling。在类之外,变量将显示在self._YourClassName__var1而不是self.__var1。不是每个人都用这个——我们根本不在我工作的地方——对于简单的类来说,使用一个单独的前导下划线让人觉得有点荒谬和恼人。

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

双前导和尾随下划线

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

相关问题 更多 >

    热门问题