在类外部分配以 __ 开头的类实例变量的值



我对python很陌生,只是想了解面向对象编程在其中的工作原理。我读到在变量前面使用双 _(下划线(表示它的值不能在类之外更改。为了测试它,我尝试运行以下代码片段。

class a:
def set_value(self,x):
self.__x = x
def get_value(self):
return self.__x
a_obj = a()
a_obj.set_value(10)
a_obj.__x = 1
print a_obj.__x
print a_obj.get_value()

它的输出是

1
10

我不明白这种行为。当我检查两个变量的 id 时,它会有所不同。我知道有一个名字重整的概念,但我不完全明白我正在做的事情是否真的是这样。

看看 https://en.wikipedia.org/wiki/Name_mangling#Python

当您分配给类之外的__x时,您没有更改现有的类变量,而是创建了一个新类变量。现有的一个被破坏为_a__x而你创建了一个新的,这确实是__x

尝试将其添加到代码末尾:

print a_obj._a__x