在 Python 的构造函数中使用 self._variable 和只使用 self.variable 有什么区别

Con*_*101 2 python class instance-variables

例如,如果我创建一个类 Point。

类点:

def__init__(self, x, y):
    self._x = x
    self._y = y 
Run Code Online (Sandbox Code Playgroud)

类点:

def__init__(self, x, y):
    self.x = x
    self.y = y 
Run Code Online (Sandbox Code Playgroud)

self._x 和 self.x 的使用有什么区别。

Ósc*_*pez 6

单下划线只是一种命名约定,表明该属性应被视为“半私有”(类似地,双下划线表示“私有”),但它没有语义差异:代码的两个版本都应该完全符合相同的。根据PEP-8

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

single_trailing_underscore_ : 按惯例使用以避免与 Python 关键字冲突。

__double_leading_underscore: 命名类属性时,调用名称修改(在 class 内部FooBar__boo变为 _ FooBar__boo)。

__double_leading_and_trailing_underscore__:存在于用户控制的命名空间中的“魔法”对象或属性。例如__init____import____file__。永远不要发明这样的名字;仅按照文档使用它们。

如果出于某种原因,您有一个带有下划线前缀的变量,并且可以公开访问此变量,那么在模块的__all__ 列表中包含此变量的名称是一个很好的做法。这用作代码内文档的一种形式。