以下代码:
class A:
def __init__(self):
self.__var = 123
def getV(self):
return self.__var
a = A()
a.__var = 10
print a.getVar(), a.__var
打印123 10
。为什么会发生这种现象?我希望a.getVar()打印出10。该类在内部将self .__ var解释为self._A__var吗?
[Python中的double下划线属性具有特殊的效果,它执行“名称修改”,即在运行时将属性__var
转换为_A__var
,即_<classname>__<attributename>
。
在您的示例中,当您将10
分配给__var
对象的属性a
时,它实际上是在创建新属性 __var
而不修改self.__var
。这是因为由于名称修改,self.__var
现在为_A__var
。
如果打印__dict__
对象的a
,则可以看到:
class A:
def __init__(self):
self.__var = 123
def getV(self):
return self.__var
a = A()
print (a.__dict__)
>> {'_A__var': 123}
如果您没有为__var
分配任何值并尝试直接打印它,则会导致AttributeError
:
class A:
def __init__(self):
self.__var = 123
def getV(self):
return self.__var
a = A()
print (a.__var)
>> AttributeError: 'A' object has no attribute '__var'
现在,如果您尝试分配给新的损坏的属性名称,您将获得正确的结果(但是此过程旨在防止意外使用此类变量:]
class A:
def __init__(self):
self.__var = 123
def getV(self):
return self.__var
a = A()
a._A__var = 10
print (a.getV())
>> 10