我想知道这些在Python中有什么区别?
self._var1 self._var1_ self.__var1 self.__var1__
首先,您可能会从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__。请勿发明此类名称;仅按记录使用它们。
此外,还可以识别出以下使用前划线或后划线的特殊形式(通常可以将它们与任何大小写惯例结合使用):
_single_leading_underscore:“内部使用”指示器较弱。例如from M import *,不导入名称以下划线开头的对象。
_single_leading_underscore
from M import *
single_trailing_underscore_:按惯例用于避免与Python关键字冲突,例如 Tkinter.Toplevel(master, class_='ClassName')
single_trailing_underscore_
Tkinter.Toplevel(master, class_='ClassName')
__double_leading_underscore:在命名类属性时,调用名称修饰(在类FooBar内部,__boo变为_FooBar__boo;见下文)。
__double_leading_underscore
__boo
_FooBar__boo
__double_leading_and_trailing_underscore__:位于用户控制的名称空间中的“魔术”对象或属性。例如__init__, __import__或__file__。请勿发明此类名称;仅按记录使用它们。
__double_leading_and_trailing_underscore__
__init__
__import__
__file__
不过,您是在类属性的上下文中询问的,因此让我们看一下您的特定示例:
在类self._var1中给属性命名会向该类的用户指示该属性只能由类的内部(或子类的内部)访问,并且他们不必直接访问它,并且可能不应修改它。您应该在Java或C#中使用private或protected字段的相同位置使用前划线,但要注意,该语言实际上并没有强制不可访问性- 相反,您相信类的用户不会做任何愚蠢的事情,然后离开如果他们真的非常确定他们知道自己在做什么,那么他们可以选择访问(或修改)您班级的私有字段。
self._var1
private
protected
self._var1_这不是我见过的东西。我认为这种命名方式在Python世界中没有任何常规含义。
self._var1_
这实际上具有语法意义。参照self.__var1从类调用的范围内名字粉碎。从您的班级外部,该变量似乎位于self._YourClassName__var1而不是self.__var1。并非每个人都使用此功能- 我们根本不在我工作的地方-对于简单的课程,使用单个下划线就显得有些荒谬和令人讨厌。
self.__var1
self._YourClassName__var1
但是,存在理由。如果您使用大量继承,如果仅使用单个前导下划线,则您将无法指示某人阅读您的代码,使“私有”变量与“受保护”变量之间的区别- 甚至不意味着子类可以访问,子类可以访问但外部世界不能访问。因此,在这种情况下,使用单个尾随下划线表示“受保护”,使用双下划线表示“私有”可能是一个有用的约定(名称改写将允许子类在其子类中使用具有相同名称的变量,而不会引起碰撞)。
self.__var1__正如我从字面上所写的那样,这是您永远都不应创建的东西,因为前导和尾随双下划线的命名方式只能用于具有Python定义的特殊含义的名称,例如类的__init__或__eq__方法。您可以随意重写它们来更改类的行为(实际上,几乎所有类都将由程序员定义__init__),但是您不应像这样的样式来编写自己的名称self.__var1__。
self.__var1__
__eq__