下面这段代码:
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中的双下划线属性有一个特殊的作用,它会进行“名称修改”,即将属性__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
关于Python 私有(private)实例变量行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58602514/