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

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

课堂要点:

def__init__(self, x, y):
    self._x = x
    self._y = y 

课堂要点:

def__init__(self, x, y):
    self.x = x
    self.y = y 

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

python大神给出的解决方案

单个下划线只是一个命名约定,用于声明该属性应被视为“半私有”(类似地,双下划线表示“私有”),但没有语义上的区别:这两个版本的代码应完全一样相同。根据PEP-8:

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

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

__double_leading_underscore:命名类属性时,调用名称处理(在类FooBar中,__boo成为_ FooBar__boo)。

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

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