Python 私有实例变量行为
Python private instance variable behavior
下面这段代码:
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。class 是否在内部将 self.__var 解释为 self._A__var?
Python中的双下划线属性有一个特殊的作用,它"name mangling"就是将属性__var
转换为_A__var
即_<classname>__<attributename>
在运行时。
在您的示例中,当您将 10
分配给 a
对象的属性 __var
时,它实际上是在创建一个 新属性 __var
而不是修改 self.__var
。这是因为 self.__var
由于名称修改而现在是 _A__var
。
打印a
对象的__dict__
可以看出:
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
下面这段代码:
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。class 是否在内部将 self.__var 解释为 self._A__var?
Python中的双下划线属性有一个特殊的作用,它"name mangling"就是将属性__var
转换为_A__var
即_<classname>__<attributename>
在运行时。
在您的示例中,当您将 10
分配给 a
对象的属性 __var
时,它实际上是在创建一个 新属性 __var
而不是修改 self.__var
。这是因为 self.__var
由于名称修改而现在是 _A__var
。
打印a
对象的__dict__
可以看出:
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