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