小编典典

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

python

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

self._var1
self._var1_
self.__var1
self.__var1__

阅读 217

收藏
2020-12-20

共1个答案

小编典典

首先,您可能会从PEP 8-Python代码样式指南中找到此报价很有帮助:

此外,还可以识别出以下使用前划线或后划线的特殊形式(通常可以将它们与任何大小写惯例结合使用):

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

single_trailing_underscore_:按惯例用于避免与Python关键字冲突,例如
Tkinter.Toplevel(master, class_='ClassName')

__double_leading_underscore:在命名类属性时,调用名称修饰(在类FooBar内部,__boo变为_FooBar__boo;见下文)。

__double_leading_and_trailing_underscore__:位于用户控制的名称空间中的“魔术”对象或属性。例如__init__
__import____file__。请勿发明此类名称;仅按记录使用它们。

不过,您是在类属性的上下文中询问的,因此让我们看一下您的特定示例:

单首划线

在类self._var1中给属性命名会向该类的用户指示该属性只能由类的内部(或子类的内部)访问,并且他们不必直接访问它,并且可能不应修改它。您应该在Java或C#中使用privateprotected字段的相同位置使用前划线,但要注意,该语言实际上并没有强制不可访问性-
相反,您相信类的用户不会做任何愚蠢的事情,然后离开如果他们真的非常确定他们知道自己在做什么,那么他们可以选择访问(或修改)您班级的私有字段。

单个前导和尾部下划线

self._var1_这不是我见过的东西。我认为这种命名方式在Python世界中没有任何常规含义。

双领先下划线

这实际上具有语法意义。参照self.__var1从类调用的范围内名字粉碎。从您的班级外部,该变量似乎位于self._YourClassName__var1而不是self.__var1。并非每个人都使用此功能-
我们根本不在我工作的地方-对于简单的课程,使用单个下划线就显得有些荒谬和令人讨厌。

但是,存在理由。如果您使用大量继承,如果仅使用单个前导下划线,则您将无法指示某人阅读您的代码,使“私有”变量与“受保护”变量之间的区别-
甚至不意味着子类可以访问,子类可以访问但外部世界不能访问。因此,在这种情况下,使用单个尾随下划线表示“受保护”,使用双下划线表示“私有”可能是一个有用的约定(名称改写将允许子类在其子类中使用具有相同名称的变量,而不会引起碰撞)。

前后双下划线

self.__var1__正如我从字面上所写的那样,这是您永远都不应创建的东西,因为前导和尾随双下划线的命名方式只能用于具有Python定义的特殊含义的名称,例如类的__init____eq__方法。您可以随意重写它们来更改类的行为(实际上,几乎所有类都将由程序员定义__init__),但是您不应像这样的样式来编写自己的名称self.__var1__

2020-12-20