有这个代码:
class A:
__x = 2
def f(self):
print(dir(self)) # there is attribute _A__x, but not __x
print(self.__x) # prints 2
print(self._A__x) # prints 2
x = A()
x.f()
print(x.__x) # AttributeError: 'A' object has no attribute '__x'
为什么在方法内部允许访问__x
变量,self.__x
但不允许在此方法外部访问?我知道带有两个下划线的名称被损坏了,但问题是有什么特别之处,因此这个未损坏的版本在方法中起作用,尽管self
只有损坏的版本作为属性。
编辑:
我注意到,如果将某些属性添加到具有表单名称的类中_A__name
,例如:
class A:
_A__y = 3
def f(self):
print(self.__y) # prints 3
print(self._A__y) # prints 3
x = A()
x.f()
然后在类内部,例如,当解释器查找变量时,__y
他也可以使用_A__y
名称,因此前缀的_A
工作原理类似于 C++ 中的范围解析,例如A::
. 但我不确定它是如何工作的细节。
所以可以扩展原始问题,为什么在这种情况下self.__y
具有与定义相同的self._A__y
效果_A__y
?