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

时间:2015-01-15 23:38:24

标签: python class instance-variables

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

class Point:

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

class Point:

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

self._x和self.x的使用有什么不同。

1 个答案:

答案 0 :(得分:4)

单个下划线只是一个命名惯例,表明应该考虑该属性"半私有" (类似地,双下划线表示"私有"),但它没有语义差异:两个版本的代码应该完全相同。根据{{​​3}}:

  

_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__。不要发明这样的名字;只能按照文件记录使用它们。

如果由于某种原因,您有一个以下划线作为前缀的变量,并且可以公开访问此变量,那么最好在模块中包含此变量的名称{{3 }}。这是一种代码内文档。